微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实体框架 - 如何正确配置一对多关系导航属性

如何解决实体框架 - 如何正确配置一对多关系导航属性

我有以下代码,其中包含基本的一对多设置。遵循 entityframeworktutorial.net 中的指南,我试图了解放置导航属性的位置。我采用了约定 4,如教程中所述,使用不可为空的键。

public class vendorImage
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int vendorImageId { get; set; }
    [required,MaxLength(50)]
    public string  ImageUrl { get; set; }

    public int vendorId { get; set; }
    public vendor vendor { get; set; }
}

public class vendor
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int vendorId { get; set; }
    [required,MaxLength(50)]
    public string Name { get; set; }

    public ICollection<vendorImage> vendorImages { get; set; }
}

使用邮递员进行测试时,我收到错误消息“检测到不支持的可能对象循环。

然后我从 vendor删除vendorImage 属性,它工作正常。

对此有解释吗?我想了解一下。

解决方法

您的错误不是实体设计错误的结果,而是 json 序列化程序的错误。 json序列化器在VendorImage类中看到了Vendor引用,无法应对对象嵌套。

要解决此问题,您可以执行此快速 hack(这应该适用于 System.text.Json 和 NewtonSoft,但请确保使用正确的 using 语句):

public class VendorImage
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int VendorImageId { get; set; }
    [Required,MaxLength(50)]
    public string  ImageUrl { get; set; }

    public int VendorId { get; set; }
    [JsonIgnore] //Add an attribute to ignore this property during serialization.
    public Vendor Vendor { get; set; }
}

public class Vendor
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int VendorId { get; set; }
    [Required,MaxLength(50)]
    public string Name { get; set; }

    public ICollection<VendorImage> VendorImages { get; set; }
}

或告诉您的服务忽略循环处理:

services.AddControllers().AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。