C# “Default(newsequentialid())”的SQL Server触发器不能与“00000000-0000-0000-0000-000000000000”一起使用?

C# “Default(newsequentialid())”的SQL Server触发器不能与“00000000-0000-0000-0000-000000000000”一起使用?,c#,sql-server,triggers,guid,bcs,C#,Sql Server,Triggers,Guid,Bcs,我有一个以Guid列作为主键的实体 它的默认值是newsequentialid。因此,如果我传递NULL,它将生成Guid 现在我将这个数据库与BDC模型一起使用。问题是,这个自动生成的代码在创建新对象时不会为ID传递NULL,相反,它可能只使用00000000-0000-0000-0000-000000000000的新Guid。所以我的默认约束不起作用,我得到一个主键约束冲突错误 那么,有没有可能用触发器捕捉到这个问题呢?可能首先检查Id是否为0000…0,然后生成一个有效的Id?传递生成有效

我有一个以Guid列作为主键的实体

它的默认值是newsequentialid。因此,如果我传递NULL,它将生成Guid

现在我将这个数据库与BDC模型一起使用。问题是,这个自动生成的代码在创建新对象时不会为ID传递NULL,相反,它可能只使用00000000-0000-0000-0000-000000000000的新Guid。所以我的默认约束不起作用,我得到一个主键约束冲突错误


那么,有没有可能用触发器捕捉到这个问题呢?可能首先检查Id是否为0000…0,然后生成一个有效的Id?

传递生成有效Guid的Guid.NewGuid。

您可以使用触发器,尽管正如其他人所指出的,这是一个不明智的解决方案,因为在代码和数据之间引入了一种看不见的黑客行为。您真正的解决方案是更改您的ORM,使其不会尝试直接插入GUID,因为这是数据库生成的

所以,忽略我剩下的答案

SqlServer不支持BEFORE触发器,但可以使用INSTEAD OF触发器 在SomeTable上创建触发器tSomeTable而不是INSERT 像 开始 插入到SomeTableSomeKey、Name中 选择 当i.SomeKey='00000000-0000-0000-0000-000000000000'时的情况 然后是newid,还有我,某个关键的结尾, i、 名字 从我开始; 结束


如何从C代码传递值,不必为此使用触发器。您可以在C代码中修复此问题。>那么,是否可以使用触发器捕获此问题?对你应该这样做吗?不。在你的“BCS模型材料”中从源头上解决问题,不管这意味着什么。如果你有一个漏水的管道,修复方法不是在你的地板上提供一个排水管,修复方法是垂直于漏水。如果你提供你现有的代码,可能有助于解决你的问题。因为,有一种方法可以通过代码设置id值。