我正在使用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();
没有抛出异常或某种想法。 你能告诉我如何删除所有旧的映射条目并在编辑时添加新条目吗?
答案 0 :(得分:0)
首先让我说你可以使用Find
从数据库中获取一个对象(如果它已经存在于本地集合中,则使用DbContext缓存):
Meal meal = MealDataContext.Meals.Find(4);
// (lower case variable name is conventional)
您应该意识到此时meal
对象具有由实体框架跟踪的MealCategories
集合。你没有,不,不应该用新的替换它。如果此时加载了集合,则替换它会从所有者meal
中删除类别,并在保存更改时删除结点记录!
在您的情况下,未加载集合,因此不会发生这种情况。
我不完全清楚为什么不保存添加到MealCategories
集合的类别。也许是因为它似乎来自不同的背景(或者是一个错字?)。但这应该抛出异常。无论如何,请确保
MealCategories
集合和你应该没事。
答案 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();