在带有 ADO.NET Entity Framework 4 的 SQL Server 中使用“Instead of”触发器的视图中插入记录时,我得到一个无效操作异常。错误消息显示:
{“对数据库的更改已成功提交,但在更新对象上下文时出错。ObjectContext可能处于不一致状态。内部异常消息:定义EntityKey的键值对不能为null或为空。参数名称:记录"}
@ at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Objects.ObjectContext.SaveChanges()
在这个简化的示例中,我创建了两个表,Contacts 和 Employers,以及一个视图 Contacts_x_Employers,它允许我一次在这两个表中插入或检索行。表只有一个名称和一个 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(CE1); Context.Contacts_x_Employers.AddObject(CE2); Context.SaveChanges(); // 有错误的行 }
</p>
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>
可以在ftp://JulioSantos.com/files/TriggerBug/的 TestViewTrggers.zip 中找到 Visual Studio 解决方案和重新创建整个应用程序的 SQL 脚本。我感谢可以提供的任何帮助。我已经花了几天的时间来解决这个问题。