实体框架多对多清除不分离?

EF 6.1.3

我有一个名为DietPlan的实体。 它与餐饮有着多对多的关系。 有一个用餐案例,饮食计划已经存在并且与膳食有关系记录,我们希望为该计划添加一顿新餐。 我通过DietPlan.Meals.Clear()来做到这一点,然后我调用saveChanges(请参阅下面的代码),然后添加应该在那里的记录,从而允许删除并添加一次。

我觉得奇怪的是,饮食计划中的膳食仍然“附加”在记忆中,因为如果我尝试打电话给已经存在的膳食附加,我得到这个错误:

附加“XYZ.Data.Models.Meal”类型的实体失败,因为另一个相同类型的实体已具有相同的主键值......

DietPlan实体代码:

public DietPlan()
{
    this.Meals = new List<Meal>();    
}
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Meal> Meals { get; set; }

膳食实体代码:

public Meal()
{
    this.DietPlans= new List<DietPlan>();    
}
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<DietPlan> DietPlans { get; set; }

保存代码:

public DietPlan Save(DietPlan record, List<Meal> addMeals)
{
    var contextEntry = this.DataContext.Entry(record); 


    if (contextEntry.State == EntityState.Detached)
    {
        this.DataContext.DietPlans.Attach(record);
    }

    if (record.ID > 0 && this.Find(record.ID) != null)
    {
        contextEntry.State = EntityState.Modified;
    }

    record.Meals.Clear();

    this.DataContext.SaveChanges();

    foreach(var meal in meals)
    {
        this.DataContext.Meals.Attach(meal); // THIS FAILS ON THE RECORD THAT WAS IN THIS COLLECTION BEFORE THE CLEAR()
    }

    this.DataContext.SaveChanges();
}

为什么是这样? 我是否应该调用另一种方法来清除也会分离实体的集合?


如果我理解得很清楚,你首先从单一的饮食计划中删除(清除)所有膳食,然后在上下文中添加(附加)一些膳食; 在饮料中仍然存在您刚刚从DietPlan中删除的食物,这可以解释您的错误。 在这种情况下,Clear方法不会将用餐与上下文分离,而只会在SaveChanges被调用时标记要删除的关系。 您有多对多的关系,并且您在底层数据库中有饮食和膳食之间的关系表。 在调用SaveChanges时,清除标记(不是真正的标记,但您可以这样想)关联表中的记录以及此表中参与关系的记录将被删除。

因此,从我的角度来看,如果您想更改DietPlan相关膳食,请使用Clear从DietPlan中删除所有膳食,然后将新膳食添加到同一DietPlan的膳食集合中

调用Clear或Remove的结果并不总是相同的,并且取决于涉及的关系的类型。 有些情况下,删除的实体在SaveChange和其他类似的删除实体上被有效地分离和删除,如果您想删除实体,则必须在调用SaveChanges之前将其删除。

链接地址: http://www.djcxy.com/p/33593.html

上一篇: Entity Framework Many to Many Clear doesnt Detach?

下一篇: Entity framework, problems updating related objects