Вставить сущность со многими ко многим связанным сущностям, которые существуют в базе данных - PullRequest
0 голосов
/ 02 июля 2018

У меня есть два объекта с отношением ко многим :

public class Order
{
   public int OrderID { get; set; }
   public string OrderName { get; set; }
   public virtual Collection<Product> Products { get; set; } = new Collection<Product>();
}

public class Product
{
   public int ProductID { get; set; }
   public string ProductName { get; set; }
   public int OrderID { get; set; }
   public virtual Collection<Order> Orders { get; set; } = new Collection<Order>();
}

// Mapping table
public class OrderProduct
{
   public int OrderId { get; set; }
   public Order Order { get; set; }
   public int ProductId { get; set; }
   public Product Product { get; set; }
}

Я хотел бы добавить новый Заказ с набором существующих Продуктов (мой API должен был бы вводить массив ProductID) в базу данных, поэтому я выполняю как:

private void AddOrder(int[] productIDs)
{
    Order newOrder = new Order();
    newOrder.Name = "New Order";

    // Here I have no clue which would be the correct way...Should I do 
    // Approach A(fetch each related entity - Product from database then add them into the collection of my new base entity - Order):
    productIDs.ToList().Foreach(p => 
        {
            newOrder.Products.Add(_dbContext.Product.FindById(p))
        }
    );

    _dbContext.Orders.Add(newOrder);
    var newOrderID = _dbContext.SaveChanges();

    // then fetch each product from database and add my new Order to its collection and save
    productIDs.ToList().Foreach(p => 
        {
            var existedProductFromDb = _dbContext.Product.FindById(p);
            existedProductFromDb.Orders.Add(newOrder);
            _dbContext.SaveChanges();
        }
    );
}

Действительно ли мне нужна таблица сопоставления между заказом и продуктом в Entity Framework Core? В противном случае, каким будет правильный способ решения вышеуказанного сценария?

1 Ответ

0 голосов
/ 02 июля 2018

Ваши сущности не представляют отношения «многие ко многим», используя объединенную таблицу. На самом деле, вы вообще не используете соединительный стол.

Итак, начните с исправления ваших сущностей:

public class Order
{
   public int OrderID {get;set;}
   public string OrderName {get;set;}

   public ICollection<OrderProduct> Products { get; set; } = new HashSet<OrderProduct>();
}

public class Product
{
   public int ProductID {get;set;}
   public string ProductName {get;set;}

   public ICollection<OrderProduct> Orders { get; set; } = new HashSet<OrderProduct>();
}

Новый Order, который содержит много Product с, так же прост, как коллекция новых OrderProduct с:

private void AddOrder(int[] productIDs)
{
    Order newOrder = new Order();
    newOrder.Name = "New Order";

    foreach (int productId in productIDs)
    {
        newOrder.Products.Add(new OrderProduct { ProductId = productId });
    }

    _dbContext.Orders.Add(newOrder);
    _dbContext.SaveChanges();
}

Также обратите внимание, что SaveChanges возвращает количество затронутых строк в базе данных, а не идентификатор вставленного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...