entity-framework-4.1 - Entity Framework 代码首先按 ID 删除而不获取(通用样式)

标签 entity-framework-4.1 ef-code-first

如果我有 ID,请告诉我这是否是删除实体而不获取实体的一种不错的方法。

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

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

在该接口(interface)的具体 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 });

以及获取实体然后调用删除。

通过调试,我对这两种情况都有预期的影响。

我只是想确保这是一个好的设计并且这种方法没有副作用。

作为引用,Ctx 只是 DbContext 本身。

谢谢。

最佳答案

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

两个备注:

  • 我想知道您是否可以简化您的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 ....)有时是有意义的(如果性能很重要)。
  • 关于entity-framework-4.1 - Entity Framework 代码首先按 ID 删除而不获取(通用样式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7756405/

    相关文章:

    c# - Entity Framework 可扩展框架

    WCF 从服务中读取数据问题

    c# - Entity Framework 4.1 仅逆向工程代码

    c# - LINQ to Entities ToString() - 建议的解决方案均无效?

    asp.net-mvc - 如何在 ASP.NET MVC 3 中更新复杂模型

    .net - EF 迁移 resx 文件中的目标字段采用哪种格式?

    .net - 使用 EF Code First 方法时的 MVC .Net 级联删除

    c# - Entity Framework 4.1 : Override IEnumerable<ValidationResult> Validate

    c# - 有没有办法在运行时查看 Entity Framework Code First 的列映射?

    c# - EF 删除子集合