2

次のようないくつかのエンティティがあるソフトウェアを開発しています。

public class Workspace
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public virtual List<Playground> Playground { get; set; }
        public virtual List<Workspace> Children { get; set; }
        public virtual List<Member> Members { get; set; }

        public virtual Workspace Parent { get; set; }
    }   

public class Playground
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public virtual List<Service> Services { get; set; }

        public virtual Workspace Workspace { get; set; }
    }

public class Service
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public virtual Playground Playground { get; set; }
    }

これらは私の EF4 POCO オブジェクトです。リポジトリ パターンと次のインターフェイスを使用しています。

public interface IRepository<T>
{
    void Add(T entity);
    void Delete(T entity);
    IEnumerable<T> Get(Expression<Func<T, bool>> expression);
    IEnumerable<T> Get();
    void Attach(T entity);

    int Save();
}

リポジトリには内部 ObjectContext があります。私のリポジトリのインスタンスを含む UnitOfWork があり、それらに加えられた変更を保存する責任があります。

私はこれまでのところ正しくやっていますか?

次のようなビジネス ロジック レイヤーを実装しています。

public class DomainWorkspaceService : DomainServiceBase
    {

        public DomainWorkspaceService(Workspace workspace)
            : base(UnitOfWorkFactory.GetInstance())
        {
        }

        public void Create(Workspace workspace)
        {
            UoW.GetRepository<Workspace>().Add(workspace);
        }

        public void Delete(Workspace workspace)
        {
            var pservice = new DomainPlaygroundService();
            foreach (var playground in workspace.Playground)
                pservice.Delete(playground);

            foreach (var child in workspace.Children)
                Delete(child);
        }

    }

今、私は正しい方向に進んでいるかどうか確信が持てません。私のPOCOは検証を担当しており、次のようなことができるようになります

SomeWorkspace.Children.Add(new Workspace {...});

これらのオブジェクトはコンテキストに関連付けられているため、それらを保存すると、コレクションへの変更もデータベースに保存されますか?

また、プレイグラウンドなしではワークスペースとサービスなしでプレイグラウンドを作成できないようにしたいと考えています。それらをどこで作成および削除する必要がありますか?

ありがとう。

4

1 に答える 1

1

ここまでは順調ですね。

Saveメソッドをリポジトリから作業単位に移動することをお勧めします。Entity Frameworkでは、コンテキスト内のすべての変更を一度に保存する必要があります。タイプごとに行うことはできません。リポジトリに配置すると、リポジトリへの変更のみが保存されることを意味しますが、これはおそらく正しくありません。

ワークスペースからプレイグラウンドへのカスケードを、手動でコーディングするのではなく、データベースカスケード(Entity Frameworkが認識してサポートする)として実装することをお勧めします。

はい、コンテキストへの変更を保存すると、関連オブジェクトを含む、追跡されたすべての変更が保存されます。

追加に関しては、ObjectContextを公開しない場合、誰でもPlaygroundを追加できる唯一の方法は、公開するオブジェクトとの関係を介することです。

于 2010-08-24T18:55:32.550 に答える