如何删除分离实体时,他们共享相同的外键,但不同的对象实例

本文关键字:实例 对象 共享 他们 何删除 删除 实体 分离 | 更新日期: 2023-09-27 18:06:08

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

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

在某些情况下,两个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实体,我得到异常:

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

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

然而,有没有更好的方法从上下文中删除多个实体?

如何删除分离实体时,他们共享相同的外键,但不同的对象实例

如果你只是想删除一个实体,你可以使用直接的SQL语句,像这样

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

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

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

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