私は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 コレクションが変更されたことを認識していないようです。どうすればそうすることができますか?
長い投稿で申し訳ありませんが、誰かが全体像を必要とする場合に備えて、すべての要素を含めたいと思いました.