我们有一个具有三列复合键的 Oracle 表。这些列通过实体框架数据模型正确映射到 C# 对象中。当我们从数据库中查询记录然后更新非键列时,我们总是收到一条错误消息,指出我们正在尝试更新主键(测试摘录如下):
var connection = new DbContextProvider(() => new DatabaseConnection());
var repo = new Repository(connection);
var deltas = repo.Queryable<Deltas>().Where(d =>d.Volume.SubmissionId == 88921).ToList();
var deltaToUpdate = deltas.First();
deltaToUpdate.RecordedVolume = 0;
repo.Flush(); -- Does a context.SaveChanges() in background
我们总是收到以下信息:
System.InvalidOperationException:属性“COPY_ID”是
对象的关键信息,不能修改。
COPY_ID 是密钥的一部分,但它是 StoredGeneratePettern=Identity,并且在事务中不会更改。
任何帮助表示赞赏。
这是完整的堆栈:
System.InvalidOperationException:属性“COPY_ID”是
对象的关键信息,不能修改。
在 Data.Objects.EntityEntry.VerifyEntityValueIsEditable(StateManagerTypeMetadata typeMetadata,Int32 序号,String memberName)
在System.Data.Objects.EntityEntry.GetAndValidateChangeMemberInfo(字符串entityMemberName,对象complexObject,字符串complexObjectMemberName,参考StateManagerTypeMetadata typeMetadata,参考字符串changingMemberName,参考对象changingObject)
在System.Data.Objects.EntityEntry.EntityMemberChanging(字符串entityMemberName,对象complexObject,字符串complexObjectMemberName)
在 System.Data.Objects.EntityEntry.EntityMemberChanging(字符串实体成员名称)
在 System.Data.Objects.ObjectStateEntry.System.Data.Objects.DataClasses.IEntityChangeTracker.EntityMemberChanging(字符串实体成员名称)
在 System.Data.Objects.Internal.SnapshotChangeTrackingStrategy.SetCurrentValue(EntityEntry 条目、StateManagerMemberMetadata 成员、Int32 序号、对象目标、对象值)
在 System.Data.Objects.Internal.EntityWrapper`1.SetCurrentValue(EntityEntry 条目、StateManagerMemberMetadata 成员、Int32 序号、对象目标、对象值)
在 System.Data.Objects.EntityEntry.SetCurrentEntityValue(StateManagerTypeMetadata 元数据,Int32 序号,对象 userObject,对象 newValue)
在 System.Data.Objects.ObjectStateEntryDbUpdatableDataRecord.SetRecordValue(Int32 序号,对象值)
在 System.Data.Objects.DbUpdatableDataRecord.SetValue(Int32 序号,对象值)
在 System.Data.Mapping.Update.Internal.UpdateTranslator.SetServerGenValue(P
ropagatorResult 上下文、对象值)
在 System.Data.Mapping.Update.Internal.UpdateTranslator.BackPropagateServerGen(列表`1生成值)
在 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter 适配器)
在 System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager实体缓存)
在 System.Data.Objects.ObjectContext.SaveChanges(SaveOptions 选项)
在 System.Data.Entity.Internal.InternalContext.SaveChanges()
在 System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
在 System.Data.Entity.DbContext.SaveChanges()
UPDATE我们跟踪了数据库交互,看起来以下 SQL 在数据库上成功运行,当它返回 EF 时,抛出错误(并且未提交更改):
declare
"COPY_ID" number(10,0);
"CODS_ID" number(10,0);
"PERIOD_ID" number(7,0);
begin
update "SCHEMA"."TABLE"
set "COLUMN" = :p0
where ((("COPY_ID" = :p1)
and ("CODS_ID" = :p2))
and ("PERIOD_ID" = :p3))
returning "COPY_ID", "CODS_ID", "PERIOD_ID" into "COPY_ID", "CODS_ID", "PERIOD_ID";
open :p4
for select "COPY_ID" as "COPY_ID", "CODS_ID" as "CODS_ID", "PERIOD_ID" as "PERIOD_ID"
from dual;
end;
{ :p0=[Decimal,0,Input]0, :p1=[Int32,0,Input]222222, :p2=[Int32,0,Input]22222, :p3=[Int32,0,Input]222222, :p4=[Object,0,Output]NULL }