插入数据库时​​检测到 属性 的自引用循环

Self referencing loop detected for property when inserting into database

我正在尝试学习 C# Fluent API,并且我 运行 遇到了(我认为)我的模型设置问题。我有三个表:OrderFile、Order、LineItem。错误:

Self referencing loop detected for property 'order' with type 'BaseService.WebApi.Order'. Path 'orders[0].lineItems[0]'.

我的结构:

它们与 Fluent API 中指定的 ForeignKey 约束绑定在一起。约束有问题吗?我试图按照这个 example for Foreign keys

modelBuilder.Entity<OrderFile>(e =>
            {
                //many orders within one order file
                //the FK relates the OrderFile to the nav key of the Order
                e.HasMany(of => of.Orders)
                .WithOne(o => o.orderFile)
                .HasForeignKey(o => o.FileGuid);

                e.HasKey(o => o.FileGuid);
            });

            modelBuilder.Entity<Order>(e =>
            {
                //each order has an array of line items
                //each line item has one order (navigation property)
                //the foreign key of the line item ties it to the Parent (List<Order>)

                e.HasMany(o => o.LineItems)
                .WithOne(li => li.order)
                .HasForeignKey(o => o.OrderGuid); 

                e.HasKey(o => o.OrderGuid);
            });

型号

public class OrderFile
{
    public Guid FileGuid { get; set; }
    public virtual ICollection<Order> Orders { get; set; } //everything with same FileGuid
}

public class Order
{
    ....
    [JsonIgnore]
    public Guid FileGuid { get; set; }

    [Key]
    public Guid OrderGuid { get; set; }
    [JsonIgnore]
    public OrderFile orderFile { get; set; }
    public virtual ICollection<LineItem> LineItems { get; set; } //everything with same OrderGuid
    }

public class LineItem
{
       ....
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
        public Guid OrderGuid { get; set; }
        public Order order { get; set; }

}

您的 LineItem 实体引用了没有 JsonIgnore 属性的订单。

基本上,您的问题源于尝试序列化具有循环依赖性(循环)的对象图,而您的设计问题是您在 API 中使用了数据库实体 类。面向客户端的模型应该与您在数据库中保存的实体不同类。