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
,