我正在创建一个Entity Framwork Code First应用程序,并且在尝试将实体多次添加到列表时遇到了问题。
我有以下两个类,它们相互引用以实现多对多关系。
public class Order
{
public virtual List<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public virtual List<Order> Orders{ get; set; }
}
这会在我的数据库中创建以下三个表:
Orders
- OrderId (PK, int)
OrderItems
- OrderItemId (PK, int)
OrderOrderItems
- Order_OrderId (PK,FK,int)
- OrderItem_OrderItemId (PK,FK,int)
在代码中,我希望执行以下操作:
private void AddOrderItemsTest
{
OrderItem orderItem = GetOrderItem(); // gets an existing order item from the DB
var order = new Order();
order.OrderItems.Add(orderItem);
order.OrderItems.Add(orderItem); // add the order item to the list a second time
context.Orders.Add(order);
}
当它持久保存到数据库时,只有一个orderItem
实体被添加到列表中。我们在表OrderOrderItems中看到OrderItem_OrderItemId是PK,因此必须是唯一的。这意味着EF已经以不允许将多个相同类型的orderItem多次添加到列表的方式设计表。
是否有可以添加的数据注释告诉EF允许我在列表中添加多个相同类型的项目?
答案 0 :(得分:1)
我认为在您的订单中处理项目计数(同一项目)的方法不正确。你真的想要10000个重复的条目加载到你的OrderItems
集合中吗?我猜不是。
您需要OrderOrderItems
表上的不同主键,因此建议引入每OrderItem
个Order
金额的新实体:
public class OrderItemDetails
{
public int OrderItemDetailsId { get; set; }
public int OrderId { get; set; }
public int OrderItemId { get; set; }
public int Amount{ get; set; }
public virtual Order Order { get; set; }
public virtual OrderItem OrderItem { get; set; }
}
public class Order
{
public virtual List<OrderItemDetails> OrderItemDetails { get; set; }
}
public class OrderItem
{
public virtual List<OrderItemDetails> OrderItemDetails { get; set; }
}
如果您不满意介绍Amount
并且仍然希望每个项目实例都有重复的条目,那将是绝对正确的,因为您的多对多关系的主键不是OrderId
的组合和OrderItemId
但OrderItemDetailsId
。