ObjectContext.SaveChanges()违反主键,抛出UpdateException?

时间:2010-09-07 18:27:26

标签: .net primary-key entity savechanges objectcontext

this MSDN documentation ...

解释
  

生成INSERT语句   实体框架并执行   SaveChanges时的数据源   调用ObjectContext。

     

如果INSERT操作成功,   服务器生成的值被写入   回到ObjectStateEntry。什么时候   AcceptChanges会自动调用   在SaveChanges结束时   执行,永久的EntityKey是   通过使用新的计算   服务器生成的值。

我的代码中似乎没有发生这种情况。当我致电ObjectContext.SaveChanges()时,会UpdateException投放InnerException.Message值:

  

“重复键值违反了唯一约束条件student_term_data_pkey”

以下是有问题的代码:

using (DataAccessLayerEntities context = new DataAccessLayerEntities()) {
     StudentTermData mostCurrent = new StudentTermData() {
          // Foreign keys:    
          StudentId = studentId,
          TermId = currentTerm.Id,

          // Non-nullable properties:
          SponsorCode = string.Empty,
          AdmissionNumber = string.Empty,
          Expiration = string.Empty
     };

     context.StudentTermDatas.AddObject(mostCurrent);
     context.SaveChanges();  // UpdateException occurs here.
}

我已验证StudentTermData.Id在我的实体数据模型中被标记为EntityKey。有没有人有任何想法或建议?

2 个答案:

答案 0 :(得分:2)

此问题是由EF4中的错误引起的,其中EF设计器未在SSDL中设置StoreGeneratedPattern属性。问题记录在this blogthis Microsoft Connect ticket中。

解决方案是在文本编辑器中打开我的模型的.edml文件,找到<EntityType Name="student_term_data"> XML标记,并将StoreGeneratedPattern="Identity"添加到用作EntityKey的属性标记中:

  <EntityType Name="student_term_data">
     <Key><PropertyRef Name="id" /></Key>
     <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
     ...
  </EntityType>

然后我在EF设计师中重新打开了我的模型,做了一个小改动(移动了一个实体位置)并保存了。这导致代码生成器运行,可能是将CDSL与SSDL同步。

我的代码现在按预期运行。

答案 1 :(得分:0)

修改

如果你试图插入,那么不要填写PK字段(我猜那是学生ID)。