如何删除分离实体时,他们共享相同的外键,但不同的对象实例
本文关键字:实例 对象 共享 他们 何删除 删除 实体 分离 | 更新日期: 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
,不需要重新附加和重新删除。