我在玩Entity Framework,並且遇到了多對多映射的絆腳石。 可以說我有兩個實體,訂單和產品。EF Code First:保存複製數據(多對多)
裏面我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將複製Product表中的所有條目。因此,如果我添加產品10,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中,以便我可以將產品附加到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);
}
你可以發佈你找到的代碼並將產品添加到訂單中嗎? – 2012-08-03 13:07:01
增加了我在做Luke的例子。 – LDJ 2012-08-03 16:40:11