如何在共享相同外键但不同对象实例时删除分离实体?

时间:2016-09-08 12:43:32

标签: c# entity-framework ef-code-first entity-framework-6

我正在尝试删除已分离的实体列表。要删除的实体与其他实体(外键)有关系,例如:

public class Foo
{
    public int BarId {get;set;}
    public virtual Bar Bar {get;set;}
}

在某些情况下,2个Foo实体可能具有相同的Bar ID。但是,因为这些是分离的实体而没有被上下文跟踪,所以2 Foo实体有2个唯一的Bar实体。

删除我正在做的Foo(在通用存储库类中):

public virtual void Delete(T entity)
{
    DbEntityEntry dbEntityEntry = dataContext.GetEntry(entity);

    if (dbEntityEntry.State != EntityState.Deleted)
    {
        dbEntityEntry.State = EntityState.Deleted;
    }

    else
    {
        dbSet.Attach(entity);
        dbSet.Remove(entity);
    }
}

这仅适用于第一个Foo实体。对于其中Bar相同的其他Foo实体,我得到例外:

  

附加类型的实体失败,因为同一类型的另一个实体已具有相同的主键值

作为一种解决方法,我在调用Foo.Bar = null之前设置Delete()。这很好。

但是,是否有更好的方法从上下文中删除多个实体?

2 个答案:

答案 0 :(得分:0)

尝试设置状态而不附加,如:

dataContext.Entry(entity).State = EntityState.Deleted;

您正在做的是检查实体状态是否尚未设置为Deleted,然后将其状态设置为Deleted。这很好,但如果实体状态已设置为Deleted,则表示您正在尝试附加和删除。这是不必要的。如果实体状态为Deleted,则表明它不是Detached,则无需重新附加并重新删除它。

答案 1 :(得分:0)

如果您只想删除实体,可以使用直接SQL语句,例如

dataContext.Database.ExecuteSqlCommand("delete from YOURTABLE where id=@id", new SqlParameter("@id", entity.id));