我有以下场景,我必须先做一些检查,然后根据这个场景决定是否使用修改后的子/子对象或新的子/子对象更新grade
对象。
如果student
列表中只有一个studentIdentity = 0
Students
{{}}},则以下情况非常有效,但是如果列表中有多个Students
({{1}应该添加并设置studentIdentity = 0
然后它无法将上下文保存回数据库。
上下文类:
EntityState.Added
存储库类:
public virtual void SetAdded(object entity)
{
Entry(entity).State = EntityState.Added;
}
public virtual void SetModified(object entity)
{
Entry(entity).State = EntityState.Modified;
}
获得以下例外:
存储更新,插入或删除语句会影响意外的行数(0)。自实体加载以来,实体可能已被修改或删除。
是否有任何需要注意处理多个新添加的内容?
答案 0 :(得分:3)
Entry(entity).State = EntityState.Added;
该行不正确。您需要将实体添加到DbSet
上的正确DbContext
或使用通用DbSet<T>
(该属性名为Set
) DbContext
。 DbSet<T>
上的方法是Add
。
例如,这可能有效:
public virtual void SetAdded<T>(T entity) where T : class
{
this.Set<T>().Add(entity);
}
关于您修改过的实体。如果DbContext
正在跟踪它们,则无需将状态设置为已修改。如果DbContext
没有跟踪它们,如果它们是在DbContext
之外创建的,那么您需要将它们附加到DbContext
。此时,您可以将状态设置为“已修改”以更新实体上的所有属性,或者可以在附加后对实体进行更改,此时将跟踪实体,并且只对实体进行修改得到更新。
如果您想要连接断开连接的实体,您可以这样做:
public virtual void SetModified<T>(T entity) where T : class
{
this.Set<T>().Attach(entity);
Entry(entity).State = EntityState.Modified;
}
最后,我建议您只在DbSet<T>
类型中指定特定的DbContext
属性并直接使用这些属性。然后在这些属性上调用Add或Attach等。
答案 1 :(得分:1)
您是否尝试过:SchoolContext.Students.Add(s);
?
我假设Students
属于DbSet
这个案例中的SchoolContext
属性。