0

我首先使用实体​​框架代码。我有两个实体:

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

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

4

2 回答 2

0

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

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

您应该意识到此时的meal对象有一个MealCategories由 Entity Framework 跟踪的集合。您不必,不,不应该用新的替换它。如果此时已加载集合,则替换它会从所有者那里删除类别,meal并且当您保存更改时,连接记录将被删除!

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

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

  1. 您不替换MealCategories集合,并且
  2. 向其添加一个类别,该类别由与餐点相同的上下文实例获取

你应该没事。

于 2013-02-08T00:18:39.230 回答
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();
于 2013-02-08T11:42:31.750 回答