Я получаю исключение недопустимой операции при вставке записей в представление, которое использует триггеры «вместо» в 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/.Я ценю любую помощь, которая может быть оказана.Я уже несколько дней работал над этой проблемой.