1

ネストされた units of work を使用して、アプリケーションに Unit of Work パターンを実装しようとしています。

次のインターフェースがあります。

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 に答える