首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectContext.SaveChanges()违反主键,抛出UpdateException?

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

Stack Overflow用户
提问于 2010-09-07 18:27:25
回答 2查看 4K关注 0票数 2

翻译从本MSDN文档 .

Entity生成一个INSERT语句,当在SaveChanges上调用ObjectContext时,该语句在数据源上执行。 如果插入操作成功,服务器生成的值将被写回ObjectStateEntry。当AcceptChanges在SaveChanges执行结束时自动调用时,将使用新服务器生成的值计算永久EntityKey。

这在我的代码中似乎没有发生。当我调用ObjectContext.SaveChanges()时,会抛出一个带有InnerException.Message值的UpdateException

“重复键值违反唯一约束student_term_data_pkey"

以下是违规代码:

代码语言:javascript
复制
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。有人有什么想法或建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-10 18:29:27

这个问题是由EF4中的一个错误引起的,其中EF设计器没有在SSDL中设置StoreGeneratedPattern属性。这个问题在这个博客这张Microsoft票据中都有记录。

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

代码语言:javascript
复制
  <EntityType Name="student_term_data">
     <Key><PropertyRef Name="id" /></Key>
     <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
     ...
  </EntityType>

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-09-07 18:40:36

编辑

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3661509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档