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);

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

第一个电话会成功,但第二个电话会给我这个例外:

AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 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);

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

例外:

具有空 EntityKey 值的对象不能附加到对象上下文。

我怎样才能做到这一点?

4

1 回答 1

1

如果myClassIdand对myStdId可以重复并且在循环中没有特定顺序,您正在运行此代码,我将使用两个字典来保存已创建和附加的实体,以避免您创建和附加具有相同键的实体时间,像这样:

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 回答