【发布时间】:2012-01-02 01:34:03
【问题描述】:
我有一个在实体框架(edmx 设计器)中映射的可更新视图
在我向我的可更新视图(和实体)添加一个标记为StoreGeneratedPattern 或Computed 的属性之前,一切都运行良好。一旦我这样做了,在保存我修改后的实体时:
var user = objectContext.Users.FirstOrDefault(u => u.Id == 123);
// user is detached and some operations are performed...
// then it's re-attached to a new ObjectContext and has its ObjectStateEntry set to Modified
secondObjectContextInstance.SaveChanges() // throws exception:
The property 'Id' is part of the object's key information and cannot be modified.
at System.Data.Objects.EntityEntry.VerifyEntityValueIsEditable(StateManagerTypeMetadata typeMetadata, Int32 ordinal, String memberName)
at System.Data.Objects.EntityEntry.GetAndValidateChangeMemberInfo(String entityMemberName, Object complexObject, String complexObjectMemberName, StateManagerTypeMetadata& typeMetadata, String& changingMemberName, Object& changingObject)
at System.Data.Objects.EntityEntry.EntityMemberChanging(String entityMemberName, Object complexObject, String complexObjectMemberName)
at System.Data.Objects.EntityEntry.EntityMemberChanging(String entityMemberName)
at System.Data.Objects.ObjectStateEntry.System.Data.Objects.DataClasses.IEntityChangeTracker.EntityMemberChanging(String entityMemberName)
at System.Data.Objects.Internal.SnapshotChangeTrackingStrategy.SetCurrentValue(EntityEntry entry, StateManagerMemberMetadata member, Int32 ordinal, Object target, Object value)
at System.Data.Objects.Internal.EntityWrapper`1.SetCurrentValue(EntityEntry entry, StateManagerMemberMetadata member, Int32 ordinal, Object target, Object value)
at System.Data.Objects.EntityEntry.SetCurrentEntityValue(StateManagerTypeMetadata metadata, Int32 ordinal, Object userObject, Object newValue)
at System.Data.Objects.ObjectStateEntryDbUpdatableDataRecord.SetRecordValue(Int32 ordinal, Object value)
at System.Data.Mapping.Update.Internal.UpdateTranslator.SetServerGenValue(PropagatorResult context, Object value)
at System.Data.Mapping.Update.Internal.UpdateTranslator.BackPropagateServerGen(List`1 generatedValues)
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Objects.ObjectContext.SaveChanges()
我没有更改 Id 的值。事实上,如果我根本不更改任何内容并简单地重新附加到第二个 ObjectContext、设置 Modified 并调用 Save,我可以重现此错误。
我可以看到为更新生成的 SQL 反映了我已将此属性设置为计算:
exec sp_executesql N'update [dbo].[UsersView]
set [UserName] = @0, [LastName] = @1, [FirstName] = @2, [MiddleName] = @3, [Suffix] = null, [Pid] = @4, [IsLoggedIn] = @5, [DisplayName] = @10
where ([Id] = @12)
select [ComputedProperty]
from [dbo].[UsersView]
where @@ROWCOUNT > 0 and [Id] = @12',N'@0 nvarchar(35),@1 nvarchar(35),@2 nvarchar(35),@3 nvarchar(35),@4 nvarchar(4),@5 bit,@6 bit,@7 bit,@8 nvarchar(max) ,@9 nvarchar(max) ,@10 nvarchar(max) ,@11 int,@12 int',@0=N'yaya',......
再次,一切正常,没有任何问题,直到我将 ComputedProperty 设置为具有 Computed 的 StoreGeneratedPattern。看来这一定与上面添加到更新 SQL 中的附加 SELECT 语句有关......因为在更新 SQL 已经执行之后发生异常。
这里有什么问题?
谢谢。
【问题讨论】:
-
可更新视图是什么意思以及如何映射它。当您使用表格时,这没有问题。
-
我的意思是我有一个 SQL Server 视图,其中定义了 Insert、Update 和 Delete 触发器。我正在使用这里的方法来解决 scope_identity 问题:stackoverflow.com/questions/5820992/…
-
我想知道我的而不是更新触发器在最后一行是否具有相同的“选择 id...”,如果这以某种方式搞砸了...很快就会回复...
标签: .net entity-framework entity-framework-4