2013-05-10 56 views
0

我想保存更改为我的上下文有两个项目。一个是新的,另一个是旧的。我能够获取对象列表并保存单个项目没有问题,但是现在我有两个项目并呼叫保存炸弹说:实体框架保存更改上下文导致错误

存储更新,插入或删除语句影响意外行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。

我的代码片段下面。

谢谢。

protected bool Save(params T[] entities) 
    { 
     foreach (T entity in entities) 
     { 
      bool b = context.Entry<T>(entity).Member<int>(string.Format("{0}Id", typeof(T).Name)).CurrentValue > 0; 

      if (b) 
      { 
       context.Context.Attach(entity); 
       context.Entry<T>(entity).State = System.Data.EntityState.Modified; 
      } 
      else 
      { 
       context.Context.Add(entity); 
       context.Entry<T>(entity).State = System.Data.EntityState.Added; 
      } 
     } 
     return context.SaveChanges() > 0; 
    } 
+2

当你附加这样的实体时,你确定数据库表中存在具有相同键的对应行吗?错误是说你试图更新db中不存在的记录。或者您拥有ConcurencyCheck | Timestamp属性,并且您正在更新的行在数据库中具有不同的值。 – jure 2013-05-10 12:45:56

+1

如果我理解正确,首先检查项目是否已经在数据库中,如果是,则附加,如果不是,则添加。但是当你附着时,它是否被分离?附加后,你没有两个具有相同ID的实体吗? – ElDog 2013-05-10 12:49:29

+0

我在列表中有两个项目。一个是新添加的(不存在于数据库中),另一个是从数据库加载的。当更新它是好的,被添加的是抛出这个异常,不知道为什么.. – 2013-05-10 13:27:37

回答

0

需要一个也是自动生成的表上的主键。