【问题标题】:Entity Framework Code First Deleting By ID Without Fetching (Generic Style)实体框架代码首先按 ID 删除而不获取(通用样式)
【发布时间】:2011-10-13 15:18:24
【问题描述】:

如果我有 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 });

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

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    两个备注:

    • 我想知道您是否可以通过以下方式简化您的 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 ....)有时是有意义的(如果性能很重要)。

    【讨论】:

    • 感谢您的反馈。我尝试了您的建议,但它杀死了我 50% 以上的单元测试。常见错误似乎是:保存不为其关系公开外键属性的实体时发生错误。 EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地处理保存时的异常。
    • 有关详细信息,请参阅 InnerException。 ---> System.Data.UpdateException:来自“Foo_Siblings”关联集中的关系处于“已删除”状态。给定多重约束,相应的“Foo_Siblings_Target”也必须处于“已删除”状态。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多