我有一个经典的3层项目,它有这些层:
我的实体已断开连接POCO
,我用它们在图层之间传递数据,并用它们绑定到UI控件。
我将一些相关实体的图表加载到UI(例如Order
,其OrderLine
和Product
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
断开连接?
答案 0 :(得分:1)
对于断开连接的POCO实体,我在持久化时遵循了这种模式。
目前,您正试图在UI中一直跟踪更改,这些更改在您准备好保留时可能相关或不相关,这在最好情况下很麻烦。我发现在持久化之前从数据库中获取最新实体的效果要好得多。
这也使您能够在执行映射时检查并发问题。