Entity Framework - Добавить элемент в список более одного раза

Я создаю приложение 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 ответ

Решение

Я считаю, что это неправильный способ обработки количества элементов (одного и того же элемента) в вашем заказе. Вы действительно хотите, чтобы 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,

Другие вопросы по тегам