1

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

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

现在我将此数据库与 BDC Model Stuff 一起使用。问题是这个自动生成的代码在创建时没有为带有新对象的 ID 传递 NULL,而是它可能只是使用new Guid()which is 00000000-0000-0000-0000-000000000000。所以我的默认约束不起作用,我得到一个主键约束冲突错误......

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

4

2 回答 2

1

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

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

SqlServer 不支持 BEFORE 触发器,但您可以使用INSTEAD OF TRIGGER
CREATE TRIGGER tSomeTable ON SomeTable INSTEAD OF INSERT
AS
BEGIN
INSERT INTO SomeTable(SomeKey, Name)
SELECT
CASE WHEN i.SomeKey = '00000000-0000-0000-0000-000000000000'
THEN newid() ELSE i.SomeKey END,
i.Name
FROM INSERTED i;
结尾

SqlFiddle 在这里

于 2014-05-26T13:25:25.153 回答
0

Guid.NewGuid()生成有效 Guid 的通行证。

于 2014-05-26T13:15:55.163 回答