2

这个 MSDN 文档中解释...

当在 ObjectContext 上调用 SaveChanges 时,实体框架会生成一条 INSERT 语句并在数据源上执行。

如果 INSERT 操作成功,服务器生成的值将被写回到 ObjectStateEntry。当在 SaveChanges 执行结束时自动调用 AcceptChanges 时,将使用新的服务器生成的值计算永久 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在我的 Entity 数据模型中标记为 EntityKey。有没有人有任何想法或建议?

4

2 回答 2

2

此问题是由 EF4 中的错误引起的,其中 EF 设计器未在 SSDL 中设置 StoreGeneratedPattern 属性。此博客此 Microsoft Connect 票证中记录了该问题。

解决方案是在文本编辑器中打开我的模型的 .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 同步。

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

于 2010-09-10T18:29:27.547 回答
0

编辑

如果您尝试进行插入,则不要填写 PK 字段(我猜那是 StudentID)。

于 2010-09-07T18:40:36.710 回答