Entity Framework 4.0 не работает с вычисляемыми свойствами - PullRequest
4 голосов
/ 02 января 2012

У меня есть обновляемое представление, которое отображается в платформе сущностей (edmx designer)

Все работает хорошо и хорошо, пока я не добавлю свойство в мое обновляемое представление (и сущность), помеченное 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 значение StoreGeneratedPattern для Computed.Похоже, что это должно быть как-то связано с дополнительным оператором SELECT, добавленным к обновлению SQL в приведенном выше ... потому что исключение происходит ПОСЛЕ того, как обновления SQL уже выполнены.

Что здесь не так?

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 января 2012

Изменение состояния записи состояния объекта приведет к тому, что каждое свойство будет изменено. Вместо этого вы должны отмечать только те свойства, которые явно изменены, как показано в этом ответе. Entity Framework 4, обновить определенные свойства

0 голосов
/ 03 января 2012

Ну, я думаю, вы могли бы назвать это моей собственной глупостью, но поведение вроде не интуитивно понятное.

В случае, если кто-либо еще использует триггеры INSTEAD OF для включения обновляемых представлений через EF, следует отметить, чтоописанная здесь реализация: ошибка при вставке в таблицу вместо триггера из структуры данных объекта следует использовать ТОЛЬКО для триггера INSTEAD OF INSERT, а не триггера INSTEAD OF UPDATE.Добавление SELECT в конец триггера вместо обновления приведет к исключению, описанному в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...