【发布时间】:2023-04-04 21:56:02
【问题描述】:
我正在使用 Entity Framework,但遇到了关于多对多映射的绊脚石。 假设我有两个实体,订单和产品。
在我的订单实体中,我有:
int OrderID,
double OrderPrice
datetime OrderDate
ICollection<Product> Products
datetime DispactDate
等等……
然后在我的产品类中,我有
int ProductID
string ProductName
string ProductDescription
等等。
在我的 Code First EF DB 中,我有一个 Order 表,它很好地映射到我的订单,一个 products 表,其中包含可以订购的产品列表,然后使用 EF Code-first 迁移 EF 创建了带有外键的 OrderProducts 到两个主其他表的键。都很好。
但是,当我保存在其产品集合中有多个产品的订单时,EF 将复制产品表中的所有条目。因此,如果我添加产品 10、12 和 13,它会使用三个新 ID 创建三个新行并映射到它们,而不是原来的。如果我随后处理另一个包含另外 20 个现有产品的订单,那么产品表中将创建 20 个新条目!
在我的 DBContext 中,我已经覆盖了 onModelCreatingEvent:
modelBuilder.Entity<Order>()
.HasMany(x=>x.Products)
.WithMany()
.Map(be =>
{
be.ToTable("OrderProducts");
});
我猜这里配置有问题。我是从How to map many-to-many relationships in Entity Framework CTP5?得到这个的
以前我有两个独立的存储库 - 一个用于订单,一个用于产品。我现在已将这些合并到 orderRepository 中,它公开了 Orders 和 Products,以便我可以将产品附加到 orderRepository 上下文。 为了生成产品,我有一个控制器操作 AddProducts:
public RedirectToRouteResult Products(FormCollection selectedProducts)
{
currentOrder.Products = new List<Product>();
foreach (string thisProduct in selectedProducts)
{
int thisProductID = int.Parse(thisProduct);
Product selectedProduct = orderRepository.Products.Where(e => e.ProductID == thisProductID).FirstOrDefault();
if (selectedProduct != null)
{
orderRepository.AttachToContext(selectedProduct);
currentOrder.Products.Add(selectedProduct);
}
}
orderRepository.saveChanges(currentOrder);
}
【问题讨论】:
-
您可以将代码发布到您要查找的位置并将产品添加到订单中吗?
-
添加了我正在做的卢克示例。
标签: .net entity-framework