我正在使用 Entity Framework 并遇到了关于多对多映射的绊脚石。假设我有两个实体,订单和产品。
在我的 Order 实体中,我有:
int OrderID,
double OrderPrice
datetime OrderDate
ICollection<Product> Products
datetime DispactDate
等等...
然后在我的产品类中我有
int ProductID
string ProductName
string ProductDescription
等等。
在我的 Code First EF DB 中,我有一个订单表,它很好地映射到我的订单,一个产品表,其中包含可以订购的产品列表,然后使用 EF 代码优先迁移 EF 创建了带有外键的 OrderProducts 的两个主键其他表。都好。
但是,当我保存在其产品集合中有多个产品的订单时,EF 正在复制产品表中的所有条目。因此,如果我添加产品 10、12 和 13,它会使用三个新 ID 创建三个新行并映射到它们,而不是原来的。如果我随后处理另一个包含另外 20 个现有产品的订单,那么产品表中将创建 20 个新条目!
在我的 DBContext 中,我已经覆盖了 onModelCreatingEvent:
modelBuilder.Entity<Order>()
.HasMany(x=>x.Products)
.WithMany()
.Map(be =>
{
be.ToTable("OrderProducts");
});
我猜这里配置有问题。我从如何在实体框架 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);
}