我正在尝试删除已分离的实体列表。要删除的实体与其他实体(外键)有关系,例如:
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()
。这很好。
但是,是否有更好的方法从上下文中删除多个实体?
答案 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));