首先使用连接的POCO进行CRUD操作,而不是使用EF代码中的断开连接的POCO

时间:2013-12-09 18:56:30

标签: c# entity-framework poco crud dbcontext

我有一个经典的3层项目,它有这些层:

  • UI(WinForm项目)
  • BLL
  • DAL(使用EF codefirst)

我的实体已断开连接POCO,我用它们在图层之间传递数据,并用它们绑定到UI控件。

我将一些相关实体的图表加载到UI(例如Order,其OrderLineProduct OrderLine,用户可以添加一些新实体,编辑其他一些并删除此图中的其他实体,然后将此图发送到DAL以将此更改保留到DB。

我希望所有这些CRUD操作都适用于一个transaction。因此,对于此要求,并且因为我的POCO已断开连接,我使用State enum跟随我的BaseEntity类以保持其状态在客户端(所有其他实体)继承自BaseEntity):

public enum States
    {
        Unchanged,
        Added,
        Modified,
        Deleted
    }

在DAL中,当我想要保留这个更改的对象图时,因为这个实体图与DbContext断开连接,我应该将我的图的根附加到创建的DbContext,因为在将根附加到DbContext状态之后DbContext中的所有条目都是Added,我应该将DbContext中每个State的{​​{1}}与我图表中Entry个实体同步,所以我使用了这些方法可以做到这一点:

State

如您所见,我在EF之外做了很多事情并且没有使用EF功能,因为我的POCO已断开连接。

有没有办法应用这些批量CRUD方案,而不会将我的public static EntityState ConvertState(BaseEntity.States state) { switch (state) { case BaseEntity.States.Added: return EntityState.Added; case BaseEntity.States.Modified: return EntityState.Modified; case BaseEntity.States.Deleted: return EntityState.Deleted; default: return EntityState.Unchanged; } } public void ApplyChanges<TEntity>(TEntity root) where TEntity : BaseEntity { _dbContext.Set<TEntity>().Add(root); foreach (var entry in _dbContext.ChangeTracker .Entries<BaseEntity>()) { BaseEntity stateInfo = entry.Entity; entry.State = ConvertState(stateInfo.State); } } POCO断开连接?

1 个答案:

答案 0 :(得分:1)

对于断开连接的POCO实体,我在持久化时遵循了这种模式。

  • 从数据库中获取连接的实体图。
  • 将断开连接的图表映射到已连接的图表。
  • 保留连接的图表。

目前,您正试图在UI中一直跟踪更改,这些更改在您准备好保留时可能相关或不相关,这在最好情况下很麻烦。我发现在持久化之前从数据库中获取最新实体的效果要好得多。

这也使您能够在执行映射时检查并发问题。