实体框架代码首先按ID删除而不进行提取(通用样式)

For*_*est 7 ef-code-first entity-framework-4.1

请告诉我,如果我有ID,这是一个删除实体而不提取实体的好方法.

我有一个带有以下界面的通用商店(我只会显示删除):

public interface IStore : IReadOnlyStore
{
    void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity, new();
    void SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

在该界面的具体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);
}
Run Code Online (Sandbox Code Playgroud)

我测试了两个新实体:

Store.Delete(new Foo() { Id = request.Entity.Id });
Run Code Online (Sandbox Code Playgroud)

以及获取实体然后调用delete.

通过调试,我对两种方案都有所期望的影响.

我只是想确保这是一个很好的设计,并且这种方法没有任何副作用.

作为参考,Ctx只是DbContext本身.

谢谢.

Sla*_*uma 3

这是很好的设计,并且没有副作用:)(恕我直言)

两点备注:

  • 我想知道您是否可以Delete通过以下方式简化您的方法:

    public void Delete<TEntity>(TEntity entity) 
        where TEntity : class, IEntity, new()
    {
        Ctx.Entry(entity).State = EntityState.Deleted;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我希望Deleted如果实体尚未附加,则将状态设置为自动附加。但我不确定它是否有效。(让我知道它是否适用于附加和分离场景(如果您应该测试这个)。)

  • 如果您考虑到性能优化(避免加载实体),请不要忘记,如果上下文中有多个要删除的实体,SaveChanges仍然会为每个实体发送一个 DELETE 语句到数据库。使用 EF 进行批量删除的性能非常糟糕,在这种情况下,返回 SQL 语句(DELETE ... WHERE ... IN ... 许多 ID...)有时是有意义的(如果性能很重要)。