私は Entity Framework で遊んでいて、多対多のマッピングに関してつまずきにぶつかっています。Orders と Products という 2 つのエンティティがあるとします。
Order エンティティ内には次のものがあります。
int OrderID,
double OrderPrice
datetime OrderDate
ICollection<Product> Products
datetime DispactDate
等々...
次に、製品クラス内に
int ProductID
string ProductName
string ProductDescription
等々。
私のCode First EF DBには、注文にうまく対応するOrder Table、注文できる製品のリストを含むproductsテーブルがあり、次にEF Code-first migrationsを使用してEFが作成したOrderProductsの両方の主キーへの外部キー他のテーブル。すべて良い。
ただし、製品コレクションに複数の製品がある注文を保存しようとすると、EF は製品テーブルのすべてのエントリを複製しています。したがって、製品 10、12、および 13 を追加すると、元の ID ではなく、3 つの新しい ID を持つ 3 つの新しい行が作成され、それらにマッピングされます。次に、別の 20 個の既存の製品で別の注文を処理すると、製品テーブルに 20 個の新しいエントリが作成されます!
私の DBContext では、onModelCreatingEvent をオーバーライドしました。
modelBuilder.Entity<Order>()
.HasMany(x=>x.Products)
.WithMany()
.Map(be =>
{
be.ToTable("OrderProducts");
});
ここで何かが間違って設定されていると思います。これは、Entity Framework CTP5 で多対多の関係をマップする方法から取得しましたか?
以前は、注文用と製品用の 2 つの別々のリポジトリがありました。これらを Orders と Products の両方を公開する 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);
}