【发布时间】:2020-01-12 13:32:36
【问题描述】:
插入触发器后在调用实体框架的dbContext.SaveChanges()时引发异常!!
错误信息:
元数据集合中不存在身份为 '' 的成员
这是我的触发代码:
ALTER trigger [dbo].[AddAccountForCustomer] on [dbo].[Customer] after insert
as
begin
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Acc_Accounts'))
BEGIN
declare @customerName nvarchar(256) = (select NameAr from inserted)
declare @customerID bigint = (select customerID from inserted)
declare @serial NCHAR(10) = (SELECT '11' + RIGHT('00000000'+ CAST(MAX(CAST(REPLACE(AccountID, '11', '') AS bigint)) + 1 AS VARCHAR(10)), 8)
FROM [Acc_Accounts] WHERE '11' = LEFT(AccountID,2));
select @serial
insert into Acc_Accounts (AccountID, [Name], AccountTypeID, ParentAccountID) values ((case when @serial is null then ('1100000001') else @serial end),
@customerName, '1000000000', '1100000000');
update [Customer] set AccountID = (case when @serial is null then ('1100000001') else @serial end) where CustomerID = @customerID;
END
end
这是在 C# 代码中的插入操作:
private static void Add(CustomerDTO Customer)
{
try
{
using (Entities context = new Entities())
{
var data = Mapper.Map<CustomerDTO, Customer>(Customer);
context.Customers.Add(data);
context.SaveChanges();
}
}
catch (Exception ex)
{
throw ex;
}
}
stackoverflow 中有同样问题的解决方案,但是移除了触发器,有没有不移除触发器的解决方案??
【问题讨论】:
-
那个触发器很乱。为什么要检查数据库中是否存在表?你不知道它是否存在?此外,该触发器假定只插入了一行,因此如果您尝试插入更多,它会爆炸。并且您应该始终在触发器开始时设置 NOCOUNT ON。修复后,错误可能会消失。
-
我已经使用了 SET NOCOUNT ON 并删除了对表存在的检查,但什么也没有发生......为什么这个跳跳虎“很糟糕”? @DavidBrowne-微软
标签: sql sql-server entity-framework triggers