实体框架 - 多次向项目列表添加项目

时间:2014-12-10 12:20:12

标签: entity-framework ef-code-first many-to-many

我正在创建一个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允许我在列表中添加多个相同类型的项目?

1 个答案:

答案 0 :(得分:1)

我认为在您的订单中处理项目计数(同一项目)的方法不正确。你真的想要10000个重复的条目加载到你的OrderItems集合中吗?我猜不是。

您需要OrderOrderItems表上的不同主键,因此建议引入每OrderItemOrder金额的新实体:

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的组合和OrderItemIdOrderItemDetailsId