如果同一列表下的多个记录具有“EntityState.Added”

时间:2017-11-22 16:46:48

标签: c# .net sql-server entity-framework entity-framework-6

我有以下场景,我必须先做一些检查,然后根据这个场景决定是否使用修改后的子/子对象或新的子/子对象更新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)。自实体加载以来,实体可能已被修改或删除。

是否有任何需要注意处理多个新添加的内容?

2 个答案:

答案 0 :(得分:3)

Entry(entity).State = EntityState.Added;

该行不正确。您需要实体添加到DbSet上的正确DbContext或使用通用DbSet<T>(该属性名为SetDbContextDbSet<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属性。