Обновляемые представления в Entity Framework 6 - PullRequest
0 голосов
/ 22 марта 2019

Я создал представление для добавления вычисляемого поля «Состояние» и переименовал базовую таблицу.
Select работает нормально.
EF выполняется с использованием POCO, без EDM.
Теперь мне нужно вставить / обновить / удалить.
Сбой с ошибкой

Не удалось обновить или вставить представление или функцию 'dbo.Clients', поскольку она содержит производное или постоянное поле.

Поэтому я добавил вместо триггеров.
Вставка из TSQL работает, но из кода EF происходит сбой с этой ошибкой

Оператор хранения, вставки или удаления затронул неожиданное количество строк (0).

Профилировщик показывает это как последний выполненный запрос

exec sp_executesql N'INSERT [dbo].[Clients]([PersonID], [HeadOfHousehold], [FamilyID], [Complete], {various other columns}, [ExpirationDate], [LastUpdatedDate], [Status])
VALUES (@0, @1, NULL, @2, @3, @4, @5, NULL, NULL, NULL, @6, @7, @8)   
SELECT [ClientID] FROM [dbo].[Clients] 
    WHERE @@ROWCOUNT > 0 AND [ClientID] = scope_identity()'    
,N'@0 int,@1 bit,@2 bit,@3 bit,@4 nvarchar(max) ,@5 bit,@6 datetime2(7),@7 datetime2(7),@8 int',@0=26402,@1=0,@2=0,@3=0,@4=N'',@5=0,@6='2020-03-22 00:00:00',@7='2019-03-22 00:00:00',@8=0    

Данные вставляются триггером, но scope_identity возвращает NULL, потому что триггер, поэтому EF считает, что 0 строк были обновлены. Очевидно, я не могу заставить EF использовать предложенный обходной путь @@ IDENTITY.

Как настроить EF для работы с обновляемым представлением?

Все предложения, которые я нашел, - обновить EDMX, которого у меня нет.

1 Ответ

0 голосов
/ 24 марта 2019

Трэвис Вандерсипен разместил ответ здесь .
Он перехватывает и изменяет SQL перед отправкой.
Я использовал несколько иную замену, @@ IDENTITYчем он.

command.CommandText = command.CommandText.Replace("WHERE @@ROWCOUNT > 0 AND [ent_pk] = scope_identity()", "WHERE @@ROWCOUNT > 0 AND [ent_id] = @@IDENTITY");

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