请告诉我,如果我有ID,这是否是在不提取实体的情况下删除实体的好方法。
我有一个带有以下界面的通用商店(我只会显示删除):
public interface IStore : IReadOnlyStore
{
void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity, new();
void SaveChanges();
}
在该界面的具体Store类中,这是我的删除方法:
public void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity, new()
{
var obj = Ctx.Entry(entity);
if (obj.State == System.Data.EntityState.Detached)
{
Ctx.Set(typeof(TEntity)).Attach(obj.Entity);
}
Ctx.Set(typeof(TEntity)).Remove(obj.Entity);
}
我测试了两个新实体:
Store.Delete(new Foo() { Id = request.Entity.Id });
以及获取实体然后调用delete。
通过调试,我对两种情况都有所期望的影响。
我只是想确保这是一个很好的设计,并且这种方法没有任何副作用。
作为参考,Ctx只是DbContext本身。
感谢。
答案 0 :(得分:3)
这是很好的设计,没有副作用:)(恕我直言)
两个评论:
我想知道您是否可以通过以下方式简化Delete
方法:
public void Delete<TEntity>(TEntity entity)
where TEntity : class, IEntity, new()
{
Ctx.Entry(entity).State = EntityState.Deleted;
}
如果实体尚未附加,我希望将状态设置为Deleted
将自动附加。但我不确定它是否有效。 (让我知道它是否适用于附加和分离的场景(如果你应该测试它)。)
如果您考虑到性能优化(避免加载实体),请不要忘记,如果在上下文中有多个要删除的实体,SaveChanges
仍将每个发送一个DELETE语句实体到数据库。使用EF进行批量删除在性能上非常糟糕,这是一个返回SQL语句的地形(DELETE ... WHERE ... IN ...许多ID ....)有时是有意义的(如果性能很重要)。< / p>