翻译从本MSDN文档 .
Entity生成一个INSERT语句,当在SaveChanges上调用ObjectContext时,该语句在数据源上执行。 如果插入操作成功,服务器生成的值将被写回ObjectStateEntry。当AcceptChanges在SaveChanges执行结束时自动调用时,将使用新服务器生成的值计算永久EntityKey。
这在我的代码中似乎没有发生。当我调用ObjectContext.SaveChanges()时,会抛出一个带有InnerException.Message值的UpdateException:
“重复键值违反唯一约束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。有人有什么想法或建议吗?
发布于 2010-09-10 18:29:27
这个问题是由EF4中的一个错误引起的,其中EF设计器没有在SSDL中设置StoreGeneratedPattern属性。这个问题在这个博客和这张Microsoft票据中都有记录。
解决方案是在文本编辑器中打开我的模型的.edml文件,定位<EntityType Name="student_term_data">标记,并将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-07 18:40:36
编辑
如果您正在尝试进行插入,则不要填写PK字段(我猜这是StudentID)。
https://stackoverflow.com/questions/3661509
复制相似问题