EF Code First Edit对映射的实体没有影响

时间:2013-02-07 22:36:38

标签: entity-framework code-first

我正在使用Entity Framework Code First。 我有两个实体:

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

没有抛出异常或某种想法。 你能告诉我如何删除所有旧的映射条目并在编辑时添加新条目吗?

2 个答案:

答案 0 :(得分:0)

首先让我说你可以使用Find从数据库中获取一个对象(如果它已经存在于本地集合中,则使用DbContext缓存):

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

您应该意识到此时meal对象具有由实体框架跟踪的MealCategories集合。你没有,不,不应该用新的替换它。如果此时加载了集合,则替换它会从所有者meal中删除类别,并在保存更改时删除结点记录!

在您的情况下,未加载集合,因此不会发生这种情况。

我不完全清楚为什么不保存添加到MealCategories集合的类别。也许是因为它似乎来自不同的背景(或者是一个错字?)。但这应该抛出异常。无论如何,请确保

  1. 您不会替换MealCategories集合和
  2. 添加一个类别,该类别由与用餐相同的上下文实例提取
  3. 你应该没事。

答案 1 :(得分: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();