コンピュープロパティ(EDMXデザイナー)私は更新可能なビュー(エンティティ)にプロパティを追加するまでEntity Frameworkの4.0は、私は、エンティティフレームワークにマッピングされている更新可能なビューを持っている
すべてがうまくと良い作品では動作しません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の値を変更していません。実際には、何も変更せずに2番目のObjectContextに再接続し、Modifiedを設定し、Saveを呼び出すだけで、このエラーを再現することができます。
私は更新のために生成されたSQLを見ることができるが計算され、私は、このプロパティを設定したことを反映しています。私は計算結果のStoreGeneratedPatternを持つようにComputedPropertyを設定するまで
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',......
は再び、すべてが問題なく、完璧に動作します。上記の更新SQLに追加された追加のSELECTステートメントと何か関係があるはずです...更新SQLの実行後に例外が発生するためです。
ここで何が間違っていますか?
ありがとうございました。
更新可能なビューとはどういう意味ですか、どのようにマップしましたか?これは、テーブルを使用するときに問題なく動作します。 –
私は、代わりに挿入、更新、および削除トリガを定義したSQL Serverビューがあることを意味します。私はscope_identityの問題を解決するためにここのアプローチを使用しています:http://stackoverflow.com/questions/5820992/error-when-inserting-into-table-having-instead-of-trigger-from-entity-data-frame – Jeff
私の代わりに更新トリガが同じ "select id ..."を最後の行に持っていて、それが何とかしていたら...すぐに返信されますか... – Jeff