0

MVC アプリケーションを開発しています。ドメイン モデルがあり、データ アクセスと Entity Framework Code First にリポジトリ パターンを使用しています。また、リポジトリ操作を呼び出す UnitOfWork クラスもあります。

私の問題は主に、集約ルートを利用し、親リポジトリを介して子オブジェクトを処理しようとしたときに発生します。

これが問題です。親クラス「サプライヤー」には、部門との契約がいくつかあります。この場合、コントラクトをサプライヤーの子にすることにしました。

新しい契約を追加するには、SupplierRepository に契約を追加するメソッドを追加する必要があります。

 public class SupplierRepository : GenericRepository<Supplier> 
        {

            public SupplierRepository(MyContext context) 
            : base(context)
            {
            }

            public void AddSupplierContract(SupplierContract contract)
            {
                 var supplier = context.Suppliers.Find(contract.SupplierId);
                 supplier.Contract.Add(contract);

            }

そして私も試しました:

            public void AddSupplierContract(SupplierContract contract)
            {
                context.Entry(contract).State = EntityState.Added;
            }

         }

私が電話するとき

_unitOfWork.save();

次のようなエラーが表示されます。

エンティティ オブジェクトは、IEntityChangeTracker の複数のインスタンスによって参照できません

UnitOfWork は私の DbContext (myDbContext) と私の SupplierRepository をインスタンス化し、myDbContext.Save() を呼び出します

  1. なぜこのような動作をするのですか
  2. 集約ルート リポジトリを実装する方法 (子オブジェクトの CRUD 操作)

私が理解している限り、リポジトリにコントラクトを取得して追加するメソッドが必要であり、MVC アプリのコントローラーでこれを行う必要はありませんが、機能していないようです。

集約ルートに関する多くの情報を見てきましたが、それを実装する方法の例はありません。

ありがとう。

解決:

さて、私はついにそれを理解しました。

したがって、リポジトリの問題ではありませんでしたが、新しい SupplierContract は、ストアを作成したユーザー エンティティを (拡張メソッドを介して) クエリしました。明らかに、このコンテキストは破棄されなかったため、コントラクト エンティティを保存するためにインスタンス化したときに、現在の DbContext が 2 つありました。

うまくいけば、誰かがこれを読んで時間を節約できます。

SupplierRepository で次のようにするだけで解決した Aggregate Root リポジトリ:

    public void AddSupplierContract(SupplierContract contract)
    {
        db.SupplierContracts.Add(contract);
    }

そして UnitOfWork.Save() メソッドを呼び出します。

4

2 に答える 2

1

技術的にはこの問題を解決したかもしれませんが、(Fowler リポジトリを使用していない限り) 設計に根本的な欠陥があることを認識していただければ幸いです: リポジトリ (DDD の種類) は集計のみを扱います。SupplierContract をコンテキストに追加する必要があるという事実は、呼び出し元のコードには関係ありません。では、なぜそのメソッドを公開するのでしょうか。また、リポジトリに保存を委任することも再検討します(他にUoWがある理由)。集合体に関する限り、あなたはそれらを行動的なものとしてではなく、構造的なものとして扱っているように感じます。したがって、あなたは痛みの世界にいるように見え、いくつかの動きを経験しますが、何の価値も得られません.

于 2012-02-13T22:24:01.743 に答える
0

このエラーを解消するには、同じMyContextインスタンスを使用してすべてのリポジトリを作成する必要があります。何らかの依存性インジェクターを使用する場合、単一のリクエストで同じ MyContext オブジェクトを構成できるはずです。たとえば、Ninject の場合は次のようになります。

kernel.Bind<MyContext>().ToSelf().InRequestScope();
于 2012-02-13T16:38:50.713 に答える