生成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。有没有人有任何想法或建议?
答案 0 :(得分:2)
此问题是由EF4中的错误引起的,其中EF设计器未在SSDL中设置StoreGeneratedPattern属性。问题记录在this blog和this 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)。