SQL Server触发'Default(newsequentialid())'不能使用'00000000-0000-0000-0000-000000000000'?

时间:2014-05-26 13:14:15

标签: c# sql-server triggers guid bcs

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

默认为(newsequentialid())。因此,如果我传递NULL,它将生成Guid。

现在我将这个数据库与BDC Model Stuff一起使用。问题是这个自动生成的代码在创建新对象的情况下不会为ID传递NULL,而是使用new Guid() 00000000-0000-0000-0000-000000000000。所以我的默认约束不起作用,我得到一个主键约束违规错误......

因此可以用触发器来捕获这个问题吗?也许首先检查Id是否为0000 ... 0,然后生成一个有效的?

2 个答案:

答案 0 :(得分:1)

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

所以忽略我的答案的其余部分。

  

SqlServer不支持BEFORE触发器,但您可以使用INSTEAD OF TRIGGER
     创建触发器可以在某些表上插入插件      AS
        BEGIN
           INSERT INTO SomeTable(SomeKey,Name)
              SELECT
                 例如,当我.SomeKey ='00000000-0000-0000-0000-000000000000'时                       那么newid()ELSE i.SomeKey END,
                 i.Name
              来自INSERTED i;
        结束

SqlFiddle here

答案 1 :(得分:0)

传递生成有效Guid的Guid.NewGuid()

相关问题