2017-01-24 12 views
0

問題が発生しましたが、なぜそれが問題なのか分かりますが、それを修正する正しい方法はわかりません。エンティティフレームワーク:IEntityChangeTrackerの複数のインスタンスでオブジェクトを参照できません

したがって、私のコントローラは、オブジェクトのカテゴリを定義する2つの文字列とともに、ProductをServiceクラスに送信します。

ここにサービスクラスがあります。

public Product AddProduct(Product p, string cat, string subcat) 
{ 
    var category = _categoryService.GetCategoryByName(cat, subcat); 
    p.Categories.Add(category); 
    return _productRepository.CreateProduct(p); 
} 

最初の行の取得はので、ここで私は私のコンテキストのインスタンスを使用し、exisitingカテゴリ(CategroyService-> CategoryRepository-> DbContext)です。

次に、そのカテゴリを製品カテゴリのリストに追加します。そして最後に私はリポジトリに渡して、それを私のデータベースに残します(EFコース)。

それから私は私が最初に製品を追加しようとし、その後、カテゴリを求める、とするので、それはだと思うエラー

An entity object cannot be referenced by multiple instances of IEntityChangeTracker. 

を取得します。変更トラッカーは2つのコンテキストを追跡する必要があり、混乱します。私のカテゴリがあるときにカテゴリの最初のコンテキストが処分されないのはなぜですか?

どうすればよいですか?

EDIT:

_categoryServiceはProductRepositoryより別のリポジトリを使用します。

答えて

1

問題は、すでに言及したように、1つのリクエスト(作業単位)でDbContextのインスタンスを使用していることです。

Webアプリケーションを開発するときは、すべてのWeb要求に対してDbContextの別のインスタンスを使用することをお勧めします.1つの要求に対してexaclty 1インスタンスを使用し、必要な変更をすべて行ったときにSaveChangesを1回だけ呼び出します。

これは、UnityのようなIoCフレームワークを使用してリポジトリにDbContextを注入すると非常に簡単です。この場合、次の設定を使用する必要がありますで

(あなたが使用している場合ユニティ):

container.RegisterType<DbContext, YourDbContext>(new PerRequestLifetimeManager(), ...); 
+0

ありがとう!私はすでにいくつかの責任を変更していました。 – TanguyB

関連する問題