2009-03-06 8 views
15

私はAdo.Net EFでモデルを持っています。私は多くの関係1つを持っていると私はエンティティを追加したいとき、私は、エラー「IEntityChangeTrackerの複数のインスタンスがエンティティオブジェクトを参照することはできません」を取り除く方法

どれ手がかり「エンティティオブジェクトがIEntityChangeTrackerの複数のインスタンスによってreferenceedすることはできません」を取得 ?

Template template = new Template(); 
... 
... 
while (from < to) 
{ 
    Course course = new Course(); 
    ..... 
    template.Course.Add(course); 
    ..... 
} 
courseEntities.AddToTemplate(template); // Problem line 
courseEntities.SaveChanges(); 

答えて

17

私はHttpContext.Itemsプロパティにデータコンテキストを格納し始めるまでこのメッセージを受け取りました。これは、現在のWebリクエストに同じデータコンテキストを使用できることを意味します。そうすれば、同じエンティティを参照する2つのデータコンテキストで終わることはありません。

ここにはDataContext Life Managementの良い投稿があります。

私はそれが役に立ちそうです。

デイブ

2

「テンプレート」、または参照して何かに似

何かが、すでにcourseEntities または別のコンテキストに追加されました。あなたがそれを行うことを示すコードには何も表示されませんが、確かに起こっています。おそらく、あなたが調整したコードのいくつかで起こっているかもしれません。デバッガの "template"のEntityStateプロパティを見て、 "template"のプロパティのEntityStateを調べます。これは、どのエンティティインスタンスがすでにコンテキスト内にあるかを知るのに役立ちます。

+2

* "テンプレートを、**または参照して何か**" * - ちょうど解決することを、あなたにクレイグありがとう*別*私のためのEFの問題(それは、あなたが今私に何か助けてくれた10のEF問題ですか?)。このエラーは、エンティティが別のコンテキストにアタッチされているだけでなく、このエンティティによって参照される* any *オブジェクトが別のコンテキストにアタッチされている場合にも発生します。 –

1

私はすでに問題を認識しています。私は別の関係を持っており、別のコンテキストから他のエンティティを取得します。

1

私はこの厄介なエラーで私の経験に関連して、それは途方もなく簡単な解決策につながるの上に行くことができます追いかけ地形を指摘してみましょう。

CompanyGroupはかなりシンプルです。それは名前を持っていて、Companyオブジェクトを持っています。

私はこれを開始しました:

1  public static void Add(CompanyGroup item) 
2  { 
3   try 
4   { 
5    using (Entities scope = new Entities()) 
6    { 
7    scope.AddToCompanyGroup(item); 
8      scope.SaveChanges(); 
9    } 
10   } 
11   catch (Exception ex) 
12   { 
13    LogException(ex, item); 
14    throw; 
15   }  
16 } 

そして、このエラーを得た:

 (IEntityWithChangeTracker)item).SetChangeTracker(null); 

で私を報い:

だから、

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

、私はライン6と7の間にこれを追加:

{"The object cannot be added to the ObjectStateManager because it already has an EntityKey. Use ObjectContext.Attach to attach an object that has an existing key."}

だから私は今、それが不満

scope.Attach(item); 

scope.AddToCompanyGroup(item); 

を変更:私は私の若さで日付の女の子のいくつかのように聞こえるし始め

{"An object with a temporary EntityKey value cannot be attached to an object context."}

( - 内容は決してありませんが、私は逃げます)

だから私は途中

(どちらか、動作しませんでした)エンティティキーのヌルを作った(動作しませんでした)して、新しいを作成する方法を使用し、私も、このエラーを得た:

{"The source query for this EntityCollection or EntityReference cannot be returned when the related object is in either an added state or a detached state and was not originally retrieved using the NoTracking merge option."}

解決策?

と、コア、ライン7,8を交換:

本質
   CompanyGroup newcg = new CompanyGroup(); 
       newcg.GroupName = item.GroupName; 
       newcg.Company = scope.Company.Where(c => c.CompanyID == item.Company.CompanyID).First(); 

     scope.AddToCompanyGroup(newcg); 
       scope.SaveChanges(); 

、Iが「アイテム」を介して渡されたデータを取り、新たに同じ を導入し、同じタイプのオブジェクトを作成するためにそれを移動させますスコープはAddで使用されるものと同じです。

0

私はこれが最も簡単で正しい解決策であることを望みます。 httprequestごとに1つのdbコンテキストが必要です。

EF4コードまずテンプレートGlobal.asax.cs http://gist.github.com/574505

void MvcApplication_BeginRequest(object sender, EventArgs e) 
{ 
HttpContext.Current.Items[SessionKey] = new Db(); 
} 

void MvcApplication_EndRequest(object sender, EventArgs e) 
{ 
var disposable = HttpContext.Current.Items[SessionKey] as IDisposable; 
if (disposable != null) 
    disposable.Dispose(); 
} 
0

私は(仮想)他のエンティティと、余分な関係を更新対象から削除することで解決したこの問題。 IDだけを残してください。

これはこれは

dataFileEntity.IterParameterValueId = parameterValueEntity.ParameterValue.Id; 
dataFileEntity.ResultParameterId = parameterValueEntity.ResultParameter.Id; 
dataFileEntity.RawDataResult = result.Value; 
RequestTestRawDataFileRepository.AddOrUpdate(dataFileEntity); 

Яэтупроблемурешила、убравизобъекта、которыйяапдейтилалишниесвязисдругимисущностями(仮想)右で間違ったコード

dataFileEntity.IterParameterValue = parameterValueEntity.ParameterValue; 
dataFileEntity.IterParameterValueId = parameterValueEntity.ParameterValue.Id; 
dataFileEntity.ResultParameter = parameterValueEntity.ResultParameter; 
dataFileEntity.ResultParameterId = parameterValueEntity.ResultParameter.Id; 
dataFileEntity.RawDataResult = result.Value; 

です。 Оставилатолькоихid。

+1

自動翻訳では、最後の段落に「私はこの問題を解決しました。他のエンティティ(仮想)のために更新する必要のないオブジェクトから削除しています。彼らのIDだけを残してください。 – orique

0

エンティティを1回だけ初期化してください。あなたが複数回あなたのエンティティを初期化する場合は

と同様

あなたはエラーが発生します。

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

は、ex:

public class Test 

{ 

private Entities db=new Entities(); 

public static void Add(CompanyGroup item) 
    { 
     try 
     { 

     db.CompanyGroup.Add(item); 
     db.SaveChanges(); 

     } 
     catch (Exception ex) 
     { 
     }  
    } 
} 
関連する問題

 関連する問題