0

私は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ます。

しかし、コレクションを編集/変更するProductColors、データベースで色が更新されません。Colors コレクションが変更されたことを認識していないようです。どうすればそうすることができますか?

長い投稿で申し訳ありませんが、誰かが全体像を必要とする場合に備えて、すべての要素を含めたいと思いました.

4

1 に答える 1

0

私は解決策を見つけることができました。Product(以前と同じ ID を使用して)新しいインスタンスを作成する代わりに、データベースから製品をフェッチします。

IQueryable<Product> products = 
    from p in db.Products.Include("Colors")
    select p;
Product product = Enumerable.FirstOrDefault(products, p => p.ID == id);

コレクションを変更するColorsと、アイテムの追跡が機能し、データベースに正しくシリアル化されているようです。

理由を理解するために少し読んだ後、データベースから製品を取得すると、コレクションを追跡する Proxy オブジェクトが作成されることがわかりました。Productを手動で作成すると、コレクションへの変更を追跡できません。

于 2013-01-15T10:15:01.510 に答える