0

私はバッチ作業をしています。既存のエンティティ間に新しい関係を追加する必要があります。エンティティには大きなデータがあり、エンティティを取得して追加できません。これを試しました:

  for .........
                Class Class = new Class() { ClassID = myClassId };
                context.AddToClasses(Class);
                Student std = new Student() { Id = myStdId };
                context.AddToStudents(std);
                context.ObjectStateManager.ChangeObjectState(Class, System.Data.EntityState.Unchanged);
                context.ObjectStateManager.ChangeObjectState(std, System.Data.EntityState.Unchanged);
                Class.ClassStudents.Add(std);

  .............

最初の呼び出しは成功しますが、2 番目の呼び出しでは次の例外が発生します。

オブジェクトのキー値が ObjectStateManager 内の別のオブジェクトと競合するため、AcceptChanges を続行できません。AcceptChanges を呼び出す前に、キー値が一意であることを確認してください。

試した:

  for .........
                Class Class = new Class() { ClassID = myClassId };
                context.Attach(Class);
                Student std = new Student() { Id = myStdId };
                context.Attach(std);
                context.ObjectStateManager.ChangeObjectState(Class, System.Data.EntityState.Unchanged);
                context.ObjectStateManager.ChangeObjectState(std, System.Data.EntityState.Unchanged);
                Class.ClassStudents.Add(std);

  .............

例外:

null EntityKey 値を持つオブジェクトは、オブジェクト コンテキストにアタッチできません。

これどうやってするの?

4

1 に答える 1

1

とのペアが繰り返し可能でmyClassIdありmyStdId、このコードで実行しているループ内で特定の順序がない場合は、2つの辞書を使用して、作成済みのエンティティと添付済みのエンティティを保持し、同じキーを持つエンティティを2番目に作成して添付しないようにします。時間、そのように:

var classDict = new Dictionary<int, Class>();
var studentDict = new Dictionary<int, Student>();

// for ... loop starts here

Class Class;
if (!classDict.TryGetValue(myClassId, out Class))
{
    Class Class = new Class() { ClassID = myClassId };
    context.Classes.Attach(Class);
    classDict.Add(myClassId, Class);
}

Student std;
if (!studentDict.TryGetValue(myStdId, out std))
{
    Student std = new Student() { Id = myStdId };
    context.Students.Attach(std);
    classDict.Add(myStdId, std);
}

Class.ClassStudents.Add(std);

// loop ends here

context.SaveChanges();
于 2013-01-08T19:26:47.577 に答える