插入存在于数据库中的具有多对多相关实体的实体

我有两个具有多对多关系的对象:

public class Order { public int OrderID { get; set; } public string OrderName { get; set; } public virtual Collection Products { get; set; } = new Collection(); } public class Product { public int ProductID { get; set; } public string ProductName { get; set; } public int OrderID { get; set; } public virtual Collection Orders { get; set; } = new Collection(); } // 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核心中的订单和产品之间的映射表? 否则,处理上述情况的正确方法是什么?

您的实体不使用连接表表示多对多关系。 实际上,根本不使用连接表。

所以,从修复你的实体开始:

 public class Order { public int OrderID {get;set;} public string OrderName {get;set;} public ICollection Products { get; set; } = new HashSet(); } public class Product { public int ProductID {get;set;} public string ProductName {get;set;} public ICollection Orders { get; set; } = new HashSet(); } 

包含许多Product的新Order就像新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返回数据库中受影响的行数,而不是插入项的Id。