1

我尝试使用嵌套工作单元在我的应用程序中实现工作单元模式。

我有以下接口:

interface IDataService
{
  IUnitOfWork NewUnitOfWork();
  INestedUnitOfWork NewNestedUnitOfWork(IUnitOfWork parent);
}

interface IUnitOfWork : IDisposable
{
  void Commit();
}

interface INestedUnitOfWork : IUnitOfWork
{
  IUnitOfWork Parent { get; }
  object GetParentObject(object obj);   // get the same object in parent uow
  object GetNestedObject(object obj);   // get the same object in this uow
}

这几乎就是XPO中发生的事情。

是否有机会使用 Entity Framework 来实现这些接口,假设版本 4,几乎没有痛苦?

我使用自动生成的实体对象,而不是 POCO。

4

1 回答 1

0

不完全是你的方式,因为我使用带有状态标志的 POCO,但它也可以应用于生成的实体。这是一种管理父实体和子实体状态的递归方法。这是Parent实体的状态管理器类:

public partial class ParentStateManager : IStateManager<Parent, MyObjContext>
{

    private IStateManager<Child, MyObjContext> _ChildStateManager = new ChildStateManager();
    public void ChangeState(Parent m, MyObjContext ctx)
    {
        if (m == null) return;
        ctx.Parents.Attach(m);
        if (m.IsDeleted)
        {
            ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Deleted);
        }
        else
        {
            if (m.IsNew)
            {
                ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Added);
            }
            else
            {
                if (m.IsDirty)
                {
                    ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Modified);
                }
            }
        }
        SetRelationsState(m, ctx);
    }
    private void SetRelationsState(Parent m, MyObjContext ctx)
    {
        foreach (Child varChild in m.Children.Where(p => !p.IsDeleted))
        {
            _ChildStateManager.ChangeState(varChild, ctx);
        }
        while (m.Children.Where(p => p.IsDeleted).Any())
        {
            _ChildStateManager.ChangeState(m.Children.Where(p => p.IsDeleted).LastOrDefault(), ctx);
        }
    }
}

这是Child实体的状态管理器:

public partial class ChildStateManager : IStateManager<Child, MyObjContext>
{

    public void ChangeState(Child m, MyObjContext ctx)
    {
        if (m == null) return;
        ctx.Children.Attach(m);
        if (m.IsDeleted)
        {
            ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Deleted);
        }
        else
        {
            if (m.IsNew)
            {
                ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Added);
            }
            else
            {
                if (m.IsDirty)
                {
                    ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Modified);
                }
            }
        }
        SetRelationsState(m, ctx);
    }
    private void SetRelationsState(Child m, MyObjContext ctx)
    {
    }
}

IStateManager是一个只有ChangeState方法的简单接口。如果Child实体有一个GrandChild集合,该ChildStateManager.SetRelationsState()方法将调用GrandChildStateManager.ChangeState()等。这有点复杂,但它适用于我,我使用 T4 模板生成状态管理器代码。

于 2012-05-21T01:17:34.053 回答