2013-01-15 149 views
0

我正在使用實體框架5和代碼優先方法。與EF代碼第一和靜態表的多對多關係

我有一個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從視圖模型對象的創建,都當他們是這是第一次創建,也是以後的創建被編輯:

db.Products.Add(product); 
db.SaveChanges(); 

而且像這樣,當他們被編輯:

db.Entry(product).State = EntityState.Modified; 
db.SaveChanges(); 

EF產生ProductsProductColorProductProductColor

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); 
} 

創建時,它們被保存在這樣的數據庫表格最初沒有問題。產品首次創建並保存時,顏色正確保存在ProductProductColor表中。

但是當我編輯/修改ProductColors集合時,數據庫中的顏色沒有更新。似乎它不承認Colors集合已被修改。我怎麼能這樣做?

對不起,這篇冗長的文章,但我想包括所有的元素,以防萬一有人需要完整的畫面。

回答

1

我設法找到解決方案。我不是創建一個新的Product實例(使用與以前相同的ID),而是從數據庫中獲取產品。

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

當我再更改Colors收集,似乎項目的跟蹤工作,並正確序列化到數據庫中。

經過一番閱讀以理解爲什麼,我看到從數據庫獲取產品會創建一個代理對象,用於跟蹤我的集合。手動創建Product時,它無法跟蹤對集合的更改。