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() を呼び出します
- なぜこのような動作をするのですか
- 集約ルート リポジトリを実装する方法 (子オブジェクトの CRUD 操作)
私が理解している限り、リポジトリにコントラクトを取得して追加するメソッドが必要であり、MVC アプリのコントローラーでこれを行う必要はありませんが、機能していないようです。
集約ルートに関する多くの情報を見てきましたが、それを実装する方法の例はありません。
ありがとう。
解決:
さて、私はついにそれを理解しました。
したがって、リポジトリの問題ではありませんでしたが、新しい SupplierContract は、ストアを作成したユーザー エンティティを (拡張メソッドを介して) クエリしました。明らかに、このコンテキストは破棄されなかったため、コントラクト エンティティを保存するためにインスタンス化したときに、現在の DbContext が 2 つありました。
うまくいけば、誰かがこれを読んで時間を節約できます。
SupplierRepository で次のようにするだけで解決した Aggregate Root リポジトリ:
public void AddSupplierContract(SupplierContract contract)
{
db.SupplierContracts.Add(contract);
}
そして UnitOfWork.Save() メソッドを呼び出します。