插入数据库时检测到 属性 的自引用循环
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]'.
我的结构:
- 订单文件包含
List<Orders>
- 订单包含
List<ListItems>
和导航 属性 OrderFile
- ListItem 包含导航 属性
Order
它们与 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 中使用了数据库实体 类。面向客户端的模型应该与您在数据库中保存的实体不同类。
我正在尝试学习 C# Fluent API,并且我 运行 遇到了(我认为)我的模型设置问题。我有三个表:OrderFile、Order、LineItem。错误:
Self referencing loop detected for property 'order' with type 'BaseService.WebApi.Order'. Path 'orders[0].lineItems[0]'.
我的结构:
- 订单文件包含
List<Orders>
- 订单包含
List<ListItems>
和导航 属性OrderFile
- ListItem 包含导航 属性
Order
它们与 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 中使用了数据库实体 类。面向客户端的模型应该与您在数据库中保存的实体不同类。