C# 如果同一列表下的多条记录具有“EntityState.Added”,则实体框架无法保存`

C# 如果同一列表下的多条记录具有“EntityState.Added”,则实体框架无法保存`,c#,.net,sql-server,entity-framework,entity-framework-6,C#,.net,Sql Server,Entity Framework,Entity Framework 6,我有以下场景,在此场景中,我必须进行一些事先检查,并在此基础上决定是否使用修改的子对象或新的子对象更新grade对象 当学生列表中只有一名学生的学生的学生时,如果列表中有多个学生(学生的学生)应该添加并设置EntityState。如果添加了,则无法将上下文保存回数据库 上下文类: public virtual void SetAdded(object entity) { Entry(entity).State = EntityState.Added; } public virtual

我有以下场景,在此场景中,我必须进行一些事先检查,并在此基础上决定是否使用修改的子对象或新的子对象更新
grade
对象

学生
列表中只有一名
学生
学生
学生
时,如果列表中有多个
学生
(学生的
学生
)应该添加并设置
EntityState。如果添加了
,则无法将上下文保存回数据库

上下文类:

public virtual void SetAdded(object entity)
{
    Entry(entity).State = EntityState.Added;
}

public virtual void SetModified(object entity)
{
    Entry(entity).State = EntityState.Modified;
}
if (grade.Teachers.IsNotNull() && grade.Teachers.Any())
{
     grade.Teachers.ForEach(i => SchoolContext.SetModified(i));
}

//Add or update Students
if (grade.Students.IsNotNull() && grade.Students.Any())
{
     grade.Students.ForEach(s =>
     {
          if (s.StudentIdentity == 0) //Works well if only one with Identity = 0 , if goes thru this multiple times, fails
          {
                SchoolContext.SetAdded(s);
          }
          else
          {
                SchoolContext.SetModified(s);
          }
     });
}

results = await StudentContext.SaveChangesAsync().ConfigureAwait(false);
存储库类:

public virtual void SetAdded(object entity)
{
    Entry(entity).State = EntityState.Added;
}

public virtual void SetModified(object entity)
{
    Entry(entity).State = EntityState.Modified;
}
if (grade.Teachers.IsNotNull() && grade.Teachers.Any())
{
     grade.Teachers.ForEach(i => SchoolContext.SetModified(i));
}

//Add or update Students
if (grade.Students.IsNotNull() && grade.Students.Any())
{
     grade.Students.ForEach(s =>
     {
          if (s.StudentIdentity == 0) //Works well if only one with Identity = 0 , if goes thru this multiple times, fails
          {
                SchoolContext.SetAdded(s);
          }
          else
          {
                SchoolContext.SetModified(s);
          }
     });
}

results = await StudentContext.SaveChangesAsync().ConfigureAwait(false);
获取以下异常:

Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除

处理多个新添加时是否需要注意任何事项?

条目(实体)。State=EntityState.Added

那条线不对。您需要将实体添加到
DbContext
上正确的
DbSet
,或使用
DbContext
上的通用
DbSet
(属性名为
Set
)。
DbSet
上的方法是
Add

例如,这可能会起作用:

public virtual void SetAdded<T>(T entity) where T : class
{
    this.Set<T>().Add(entity);
}
最后,我建议只在
DbContext
类型上指定特定的
DbSet
属性,并直接使用这些属性。然后对这些属性调用Add或Attach等

那条线不对。您需要将实体添加到
DbContext
上正确的
DbSet
,或使用
DbContext
上的通用
DbSet
(属性名为
Set
)。
DbSet
上的方法是
Add

例如,这可能会起作用:

public virtual void SetAdded<T>(T entity) where T : class
{
    this.Set<T>().Add(entity);
}

最后,我建议只在
DbContext
类型上指定特定的
DbSet
属性,并直接使用这些属性。然后对这些属性调用Add或Attach等。

您是否尝试过:
SchoolContext.Students.Add


我假设
Students
SchoolContext
本例中的
DbSet
属性。

您是否尝试过:
SchoolContext.Students.Add


我假设
Students
SchoolContext
中的
DbSet
属性。

什么是
SetAdded
SetModified
?共享该代码。什么是
SetAdded
SetModified
?分享这些代码。这个解释非常有用!!但是仍然无法理解,
this.Set().Add(entity)有多么不同
比Entry(entity)更有效。State=EntityState.Add
?@AviKenjale-
。Add
将实体以及任何关联的新关系添加到具有State
Add
的DbContext中,实体将由DbContext跟踪,并确保在调用
SaveChanges
时创建它们。
Entry(entity)
应该存在于您的
DbContext
中,如果它是新的,则在您完成此步骤之前,因此此时更改状态没有任何效果。我相信
SetModified
方法必须修改,并且应该具有
Entry(entity)。state=EntityState.modified附加实体并将状态设置为“已修改”可用于更新。只是附加并没有多大作用。这个解释很有帮助!!但是仍然无法理解,
this.Set().Add(entity)有多么不同
比Entry(entity)更有效。State=EntityState.Add
?@AviKenjale-
。Add
将实体以及任何关联的新关系添加到具有State
Add
的DbContext中,实体将由DbContext跟踪,并确保在调用
SaveChanges
时创建它们。
Entry(entity)
应该存在于您的
DbContext
中,如果它是新的,则在您完成此步骤之前,因此此时更改状态没有任何效果。我相信
SetModified
方法必须修改,并且应该具有
Entry(entity)。state=EntityState.modified附加实体并将状态设置为“已修改”可用于更新。只是附加并不能做更多的事情。