1

切断された POCO オブジェクトを使用しています。

単一のオブジェクトを永続化すると、正常に動作します!

問題は、関連するオブジェクトを永続化したいときに始まります。

例えば:

データ層からオブジェクトを取得しています:

using (MyContext ctx = new MyContext ())
{
    return ctx.Users.First();  
}

このオブジェクトはビジネス レイヤーに戻り、そこでいくつかの子レコードを追加します。以下を参照してください (説明のため):

objectUser.Permissions.Add(new Permission());
objectUser.Permissions.Add(new Permission());

権限は、ユーザー権限へのナビゲーションです。

そして、この objectUser をデータベースに永続化したいので、次のようにします。

using (MyContext ctx = new MyContext ())
{
    ctx.Users.Attach(objectUser);
    ctx.ObjectStateManager.ChangeObjectState(objectUser, System.Data.EntityState.Modified);
    ctx.SaveChanges();                       
}

しかし、使用中の最初の行で、「同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません」というエラーが表示されます。

私が何か間違ったことをしているかどうかは誰にもわかりますか?

オブジェクトとそれに関連するオブジェクトを永続化したいだけです。

私を助けてくれてありがとう。

ルイス・グスタボ


エンティティをデタッチしようとしましたが、この場合、関連するすべてのオブジェクトが失われ、追加/削除できるようにこれらの関連オブジェクトが必要です。

その後、それらをデータベースに永続化したいと思いました。

私は愚かなアーキテクチャをやっていますか??

ルイス・グスタボ

4

1 に答える 1

0

ここでの問題objectUserは、データベースからオブジェクトを取得するために使用されるコンテキストにオブジェクトがまだ関連付けられていることです。2 つの異なるコンテキストが定義されているこのワークフローが必要な場合はobjectUser、最初のコンテキストから を切り離す必要があります。objectUserこれを行う 1 つの方法は、コンテキスト オブジェクトのオブジェクト トラッキングをオフにすることです。または、コンテキストからオブジェクトを手動で切り離すこともできます。

using (MyContext ctx = new MyContext ())
{
    //EF 4.1 - ctx.Configuration.AutoDetectChangesEnabled = false;
    ctx.Users.MergeOption = MergeOption.NoTracking;

    return ctx.Users.First();  
}

ブログ: http://blogs.msdn.com/b/dsimmons/archive/2010/01/12/ef-merge-options-and-compiled-queries.aspx

パート 1 は、MergeOption プロパティに関するすべてです。

于 2011-11-29T18:51:16.087 に答える