【问题标题】:Entity Framework 4.0 Doesn't Work With Computed PropertiesEntity Framework 4.0 不适用于计算属性
【发布时间】:2012-01-02 01:34:03
【问题描述】:

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

在我向我的可更新视图(和实体)添加一个标记为StoreGeneratedPatternComputed 的属性之前,一切都运行良好。一旦我这样做了,在保存我修改后的实体时:

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


【解决方案1】:

将对象状态条目的状态设置为已修改将导致每个属性都设置为已修改。相反,您应该只标记明确修改的属性,如本答案所示。 Entity framework 4, update specific properties

【讨论】:

  • 将状态设置为已修改只会影响将StoreGeneratedPattern 设置为None 的属性。 StoreGeneratedPattern 设置为 IdentityComputed 的属性不应受到影响。
【解决方案2】:

好吧,我想你可以称其为我自己的愚蠢,但这种行为有点不直观。

如果其他人实现 INSTEAD OF 触发器以通过 EF 启用可更新视图,应注意此处描述的实现:error when inserting into table having instead of trigger from entity data framework 应仅用于 INSTEAD OF INSERT 触发器,而不是 INSTEAD OF UPDATE 触发器。在而不是更新触发器的末尾添加 SELECT 将导致问题中描述的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2021-02-28
    • 2011-04-27
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多