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