EF4: ObjectContext несовместим при вставке в представление с помощью триггеров - PullRequest
1 голос
/ 12 февраля 2011

Я получаю исключение недопустимой операции при вставке записей в представление, которое использует триггеры «вместо» в SQL Server с ADO.NET Entity Framework 4. Сообщение об ошибке гласит:

{"Theизменения в базе данных были успешно зафиксированы, но при обновлении контекста объекта произошла ошибка. Возможно, ObjectContext находится в несогласованном состоянии. Внутреннее сообщение об исключении: пары ключ-значение, определяющие EntityKey, не могут быть пустыми или пустыми."}

@ at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
  at System.Data.Objects.ObjectContext.SaveChanges()

В этом упрощенном примере я создал две таблицы, Контакты и Работодатели, и одно представление Contacts_x_Employers, которое позволяет мне вставлять или извлекать строки в / из этих двух таблиц одновременно.Таблицы имеют только атрибуты Name и ID, и представление основано на объединении обоих:

CREATE VIEW [dbo].[Contacts_x_Employers]
AS
SELECT dbo.Contacts.ContactName, dbo.Employers.EmployerName
FROM dbo.Contacts INNER JOIN dbo.Employers 
ON dbo.Contacts.EmployerID = dbo.Employers.EmployerID

И имеет этот триггер:

Create TRIGGER C_x_E_Inserts
   ON  Contacts_x_Employers
   INSTEAD of INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    insert into Employers (EmployerName)
    select i.EmployerName 
        from inserted i
    where  not i.EmployerName in 
    (select EmployerName from Employers)

    insert into Contacts (ContactName, EmployerID)
    select i.ContactName, e.EmployerID 
    from inserted i inner join employers e
    on i.EmployerName = e.EmployerName;

END
GO

Код .NET следующий:

использование (var Context = new TriggersTestEntities ()) {Contacts_x_Employers CE1 = new Contacts_x_Employers ();CE1.ContactName = "J";CE1.EmployerName = "T";Contacts_x_Employers CE2 = новые Contacts_x_Employers ();CE1.ContactName = "W";CE1.EmployerName = "C";Context.Contacts_x_Employers.AddObject (СП1);Context.Contacts_x_Employers.AddObject (СП2);Context.SaveChanges ();// строка с ошибкой}

SSDL и CSDL (узлы представления):

<EntityType Name="Contacts_x_Employers">
   <Key>
    <PropertyRef Name="ContactName" />
<PropertyRef Name="EmployerName" />
   </Key>
<Property Name="ContactName" Type="varchar" Nullable="false" MaxLength="50" />
<Property Name="EmployerName" Type="varchar" Nullable="false" MaxLength="50" />
 </EntityType>

<EntityType Name="Contacts_x_Employers">
  <Key>
     <PropertyRef Name="ContactName" />
     <PropertyRef Name="EmployerName" />
   </Key>
   <Property Name="ContactName" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" />
   <Property Name="EmployerName" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" />
</EntityType>

Решение Visual Studio и сценарии SQL для повторного создания всегоПриложение можно найти в TestViewTrggers.zip по адресу ftp: //JulioSantos.com/files/TriggerBug/.Я ценю любую помощь, которая может быть оказана.Я уже несколько дней работал над этой проблемой.

1 Ответ

1 голос
/ 08 марта 2011

Я наткнулся на ту же проблему, когда пытался вставить строку в представление с помощью триггеров «вместо вставки» и «вместо обновления».

Я думаю, что нашел решение: когда мастер Visual StudioОтбросьте представление в своей модели, добавьте StoreGeneratedPattern = "Identity" для некоторых свойств (возможно, ключей вашей сущности).

При генерации запросов к обычной таблице это свойство указывает платформе сущности ожидать IDв свою очередь, он добавляет select scope_identity () в конце вставки.

Теперь с обновляемыми представлениями scope_identity ввинчивается, потому что вставка происходит в другой области и возвращает ноль, поэтому вставка не удалась.

Если вы удалите этот StoreGeneratedPattern = "Identity" из модели, структура сущностей не добавит select scope_identity (), и вставка работает нормально.

Я надеюсь, что это решит вашу проблему и что онане приходит слишком поздно.

Приветствия

Подробнее здесь: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/9fe80b08-0b67-4163-9cb0-41dee5115148/

...