Herman<T>.Instance Ответов: 1

Ef6 или отображения результатов в странный запрос на обновление


Привет Ребята,

в моем сервисе ODATA я использую EF6 для работы с SQL Server.
EDMX создается также для табличных отделов. В этой таблице есть поле временной метки для целей параллелизма. И да, я добавил аннотацию данных [Timestamp] в код. И в edmx в области фиксируется в режиме параллелизма.

Когда я выбираю отдел на своем веб сайте datagrid и обновляю поле я получаю сообщение:
Cannot update a timestamp column.


В SQlProfiler я вижу прохождение обновления:
exec sp_executesql N'UPDATE [dbo].[Department]
SET [ModificationDate] = @0, [ModifiedBy] = @1
WHERE (([Id] = @2) AND ([ModificationDate] = @3))
',N'@0 binary(8),@1 int,@2 int,@3 binary(8)',@0=0x0000000000000805,@1=27,@2=3,@3=0x0000000000000805
go


И тут я замечаю любопытную вещь. Он хочет обновить поле ModificationDate (метка времени), в то время как я хочу обновить поле DepartmentName в сущности.

Как мне преодолеть это странное поведение?

Обновление!
Я установил столбец в вычисляемый, и теперь столбец не добавляется в заданную часть запроса.
Но почему на местах Кафедраимя не установлен в запросе на обновление на эф?

Что я уже пробовал:

Это мой код. Имя отдела установлено! (SelectedEntity находится в aspx-файл.код КС, когда команды событие rowupdating выполняется.
if (SelectedEntity == null)
                   SelectedEntity = new Department();
               else
                   SelectedEntity = MarinGlobalConnection.MarinGlobalDataService._marinGlobal.Departments.First(x => x.Id == SelectedEntity.Id);
               SelectedEntity.DepartmentName = afdelingNaam;
               SelectedEntity.IsDeleted = isdeleted;
               SelectedEntity.ModifiedBy = CurrentUser.Instance.CurrentConnected == null ? (int?)null : CurrentUser.Instance.CurrentConnected.ID;
               if (SelectedEntity.Id == 0)
                   MarinGlobalConnection.MarinGlobalDataService._marinGlobal.AddToDepartments(SelectedEntity);
               else
               {
                   if (CompareModificationdate(modificationdate))
                       MarinGlobalConnection.MarinGlobalDataService._marinGlobal.UpdateObject(SelectedEntity);
               }
               await SaveChangesAsync();

1 Ответов

Рейтинг:
0

Dave Kreskowiak

Вы никогда не давали никаких подробностей о своей схеме базы данных, закодированной в EF, так что это всего лишь предположение.

То, что вы видите, - это ожидаемое поведение.

Вы не должны вносить никаких изменений в столбец с тегом [Timestamp] в EF. Поля временных меток полностью управляются EF. Они используются для управления параллелизмом и никогда не должны быть частью вашей модели данных.


Herman<T>.Instance

Пинта заключается в том, что, несмотря на использование dataannotaion в EF, поле было обновлено запросом, сгенерированным EF6. Я установил столбец в вычисленное значение. Нет, EF6 больше не точит мою колонку.