2012-01-02 5 views
4

コンピュープロパティ(EDMXデザイナー)私は更新可能なビュー(エンティティ)にプロパティを追加するまでEntity Frameworkの4.0は、私は、エンティティフレームワークにマッピングされている更新可能なビューを持っている

すべてがうまくと良い作品では動作しませんComputedStoreGeneratedPatternでマークされています。私がそれをしたら、変更されたエンティティを保存するとき:

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の実行後に例外が発生するためです。

ここで何が間違っていますか?

ありがとうございました。

+0

更新可能なビューとはどういう意味ですか、どのようにマップしましたか?これは、テーブルを使用するときに問題なく動作します。 –

+0

私は、代わりに挿入、更新、および削除トリガを定義したSQL Serverビューがあることを意味します。私はscope_identityの問題を解決するためにここのアプローチを使用しています:http://stackoverflow.com/questions/5820992/error-when-inserting-into-table-having-instead-of-trigger-from-entity-data-frame – Jeff

+0

私の代わりに更新トリガが同じ "select id ..."を最後の行に持っていて、それが何とかしていたら...すぐに返信されますか... – Jeff

答えて

1

オブジェクト状態エントリの状態をmodifiedに設定すると、すべてのプロパティがmodifiedとして設定されます。代わりに、この回答に示されているように、明示的に変更されたプロパティのみをマークする必要があります。 Entity framework 4, update specific properties

+1

状態をmodifiedに設定すると、 StoreGeneratedPattern'を「None」に設定する。 'StoreGeneratedPattern'が' Identity'または 'Computed'に設定されたプロパティは影響を受けません。 –

0

まあ、あなたはそれを自分の愚かさと呼ぶことができると思いますが、その動作は直感的ではありません。

他の誰かがEF経由で更新可能なビューを有効にするためにINSTEAD OFトリガを実装する場合、error when inserting into table having instead of trigger from entity data frameworkは、INSTEAD OF UPDATEトリガではなく、INSTEAD OF INSERTトリガでのみ使用する必要があります。更新トリガーの代わりにSELECTを追加すると、その質問で説明されている例外が発生します。

関連する問題