.net 实体框架4.0没有';不能处理计算属性

.net 实体框架4.0没有';不能处理计算属性,.net,entity-framework,entity-framework-4,.net,Entity Framework,Entity Framework 4,我有一个在实体框架(edmx设计器)中映射的可更新视图 在我向可更新视图(和实体)添加一个属性之前,一切都很好,该属性用Computed的StoreGeneratedPattern标记。一旦我这样做,在保存修改后的实体时: var user = objectContext.Users.FirstOrDefault(u => u.Id == 123); // user is detached and some operations are performed... // then it's

我有一个在实体框架(edmx设计器)中映射的可更新视图

在我向可更新视图(和实体)添加一个属性之前,一切都很好,该属性用
Computed
StoreGeneratedPattern
标记。一旦我这样做,在保存修改后的实体时:

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反映出我已将此属性设置为computed:

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设置为具有一个StoreGeneratedPattern的Computed属性之前,一切工作都是完美的,没有任何问题。这似乎与上面添加到更新SQL的附加SELECT语句有关……因为异常发生在更新SQL已经执行之后

这里怎么了


谢谢。

将对象状态项的状态设置为“已修改”将导致每个属性都设置为“已修改”。相反,您应该只标记如本答案所示显式修改的属性

嗯,我想你可以称之为我自己的愚蠢,但这种行为有点非直觉


如果其他任何人实现了INSTEAD OF触发器以通过EF启用可更新视图,则应注意,此处描述的实现:应仅用于INSTEAD OF INSERT触发器,而不是INSTEAD OF UPDATE触发器。将SELECT添加到instead of update触发器的末尾将导致问题中描述的异常。

将状态设置为MODIFED将只影响
StoreGeneratedPattern
设置为
None
的属性。
StoreGeneratedPattern
设置为
Identity
Computed
的属性不应受到影响。可更新视图是什么意思?您是如何映射它的。这在使用表时不会出现问题。我的意思是,我有一个SQL Server视图,其中定义了Insert、Update和Delete触发器,而不是Insert、Update和Delete触发器。我在这里使用这种方法来解决scope_标识问题:我想知道我的instead of update触发器是否与最后一行中的“select id…”相同,如果它以某种方式搞砸了…将很快发回。。。