考虑下表:
create table master
( nr number(10,0) identity primary key
lastmodified date
scn number(12,0) -- update from sequence with every update
)
create table details
( nr number(10,0) primary key
linenum number(3,0) primary key
<more details>
scn number(12,0) -- update from sequence with every update
)
表详细信息具有从列 nr 到列 nr 的外键。两个表都映射到具有主数据库键作为实体键的实体。Master 和 Detail 之间存在一对多的关系。
当我在 EF 上下文中添加一个具有单个详细信息的 master 并调用 SaveChanges 时,master 中的 nr 字段由数据库中的触发器确定,返回给 EF,写入 details.nr 属性并保存在 details 表中。干得好,EF!
但是,当我尝试更新详细信息实体中的一个详细信息字段并调用 SaveChanges 时,我收到错误消息“属性 'Nr' 是对象的关键信息的一部分,无法修改。” 显然 EF 试图从相关的 Master 更新 Nr 字段。当然,哪个没有修改。
解决此限制的最佳方法是什么?添加新的实体键字段并更改主键列不是一种选择。
免责声明:我手工编写代码以专注于这个问题,它可能无法编译,但我希望你明白这一点。
更新:我认为(希望...)问题已解决。如果我将 Detail 实体中的 SCN 字段设置为 ConcurrencyMode=Fixed 和 StoreGeneratedPattern=Computed,则会出现有关 Nr 字段的错误消息。如果我将 SCN 字段设置为 ConcurrencyMode=Fixed 和 StoreGeneratedPattern=None,则 SaveChanges 将返回而不会出现错误。