2013-02-07 116 views
0

我正在使用實體框架代碼。 我有兩個實體:EF代碼優先編輯對映射實體沒有影響

public class Meal 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int MealID { get; set; } 


    public virtual List<MealCategory> MealCategories { get; set; } 

} 
    public class MealCategory 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int MealCategoryID { get; set; } 


    public virtual List<Meal> Meals { get; set; } 

} 

它們在配置映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Meal>() 
     .HasMany(c => c.MealCategories) 
     .WithMany(x => x.Meals) 
     .Map(a => 
     { 
      a.ToTable("MealCategoryMapping"); 
      a.MapLeftKey("MealID"); 
      a.MapRightKey("MealCategoryID"); 
     }); 


    } 

當與現有分類它完美地添加新的飯,ID被正確插入映射表

 Meal Meal = new Meal(); 

     Meal.MealCategories = new List<MealCategory>(); 

     var categoryToBeAdded = (from x in Context.MealCategoreis where x.MealCategoryID == 1 select x).FirstOrDefault(); 
     Meal.MealCategories.Add(categoryToBeAdded); 

     MealDataContext.Add(Meal); 
     MealDataContext.SaveChanges(); 

但是,如果我嘗試編輯膳食並添加新類別,映射表中不會發生任何事情。舊條目保持不變,新條目不添加。

Meal Meal = (from x in MealDataContext where x.MealID == 1 select x).FirstOrDefault(); 

     Meal.MealCategories = new List<MealCategory>(); 

     var categoryToBeAdded = (from x in Context.MealCategoreis where x.MealCategoryID == 4 select x).FirstOrDefault(); 
     Meal.MealCategories.Add(categoryToBeAdded); 

     MealDataContext.Attach(entityToUpdate); 
     MealDataContext.Entry(entityToUpdate).State = EntityState.Modified; 
     MealDataContext.SaveChanges(); 

沒有例外或somethink引發。 你能告訴我如何在編輯時刪除所有舊的映射條目並添加新的映射條目嗎?

+1

'entityToUpdate'的作用是什麼? –

回答

0

試試這個。致電Collection("MealCategories").Load();應該讓EF創建一個跟蹤收藏。

Meal Meal = (from x in MealDataContext where x.MealID == 1 select x).FirstOrDefault(); 

MealDataContext.Attach(entityToUpdate); 
MealDataContext.Entry(entityToUpdate).State = EntityState.Modified; 
MealDataContext.Entry(entityToUpdate).Collection("MealCategories").Load(); 

var categoryToBeAdded = (
    from x in Context.MealCategories 
    where x.MealCategoryID == 4 
    select x).FirstOrDefault(); 

Meal.MealCategories.Add(categoryToBeAdded); 

MealDataContext.SaveChanges(); 
0

首先讓我說,你可以使用Find來從數據庫中的對象(或者的DbContext緩存,如果它已經存在於局部集合中):

Meal meal = MealDataContext.Meals.Find(4); 
// (lower case variable name is conventional) 

你應該認識到,在meal對象這一點有一個由Entity Framework跟蹤的MealCategories集合。你不必,不,不應該取代它一個新的。如果該集合在該點加載,則替換該集合會從所有者meal中刪除類別,並且當您保存更改時,結合記錄將被刪除!

在你的情況下,集合沒有加載,所以這不會發生。

我不完全清楚爲什麼您添加到MealCategories集合的類別沒有保存。也許是因爲它似乎來自不同的背景(或者是一個錯字?)。但是這應該會引發異常。總之,確保

  1. 你不用更換MealCategories集合,
  2. 添加類別它是由相同的上下文實例作爲餐獲取

,你應該確定。

+0

謝謝您的回覆。我使用相同的上下文添加類別。但是,這對映射沒有影響。我追蹤了sql,但只有用於更新膳食的聲明被生成/執行。你有另一個想法嗎? –

+0

您可以將相同的上下文中的膳食類別添加到'meal.MealCategories'集合中_instance_? (不是同一個上下文_class_的多個實例)。 –