私はEntity Framework 5とコードファーストのアプローチを使用しています。
私はProduct
ゼロ以上を持つことができるクラスを持っていますProductColors
。色は、シードを使用してデータベースに事前設定されています。EF を使用してカラー テーブルに新しいアイテムを設定しないでください。これは、拡大されないアイテムの静的なリストであるためです。色は多くの製品で再利用されます。
私のモデルクラス:
public class Product
{
public int ID { get; set; }
public string Title { get; set; }
public virtual ICollection<ProductColor> Colors { get; set; }
}
public class ProductColor
{
public int ID { get; set; }
public string Title { get; set; }
}
私の中でDbMigrationsConfiguration
:
protected override void Seed(... context)
{
context.ProductColors.AddOrUpdate(
p => p.ID,
new ProductColor(1, "White"),
new ProductColor(2, "Black"),
new ProductColor(3, "Red"));
}
私の中でDbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>().HasMany(x => x.Colors).WithMany();
}
public DbSet<Product> Products { get; set; }
私Products
は、最初に作成されたときと後で編集されたときの両方で、viewmodel オブジェクトから作成されます。
Product product = new Product { ID = productViewModel.ID };
product.Colors = new List<ProductColor>();
foreach (int colorId in productViewModel.SelectedColorIds)
{
ProductColor productColor = productColors.Find(m => m.ID == colorId);
product.Colors.Add(productColor);
}
これらは、作成時に次のようにデータベースに保存されます。
db.Products.Add(product);
db.SaveChanges();
そして、編集すると次のようになります。
db.Entry(product).State = EntityState.Modified;
db.SaveChanges();
EF は を生成Products
し、テーブルは最初は問題ProductColor
ありません。ProductProductColor
製品を最初に作成して保存すると、色がテーブルに適切に保存されProductProductColor
ます。
しかし、コレクションを編集/変更するProduct
とColors
、データベースで色が更新されません。Colors コレクションが変更されたことを認識していないようです。どうすればそうすることができますか?
長い投稿で申し訳ありませんが、誰かが全体像を必要とする場合に備えて、すべての要素を含めたいと思いました.