设置
我有一个uniqueidentifier
列设置为primary key
,Default Value or Binding
为(newsequentialid())
。
什么有用
在我的MVC项目中,我可以使用[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
和Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
之类的东西来允许SQL Server接管并使用指定的Default Value or Binding
来自动生成Sequential Guid,这样可行细
什么不起作用
但是,如果我在MVC项目之外编写代码,特别是在LINQPad中,总是插入一个空的Guid,例如00000000-0000-0000-0000-000000000000
:
Resources.InsertOnSubmit(new Resource());
SubmitChanges();
我知道我可以写这样的东西来插入一个随机的Guid值:new Resource() { Id = Guid.NewGuid() }
,但我需要一个顺序指导。
为什么我感到困惑
我的印象是,当一个null或空值传递给SQL Server列时,Default Value or Binding
(如果已指定)将自动使用。
问题#1:
为什么在使用LINQPad时会忽略Default Value or Binding
?
问题#2:
当我无法访问上述MVC属性时,如何让SQL Server使用指定的Default Value or Binding
(newsequentialid())
?
答案 0 :(得分:1)
关于第二个问题,如果在insert语句中明确指定NULL
,SQL Server将忽略列上的默认绑定。同样,如果您的MVC项目生成Guid
的默认00000000-0000-0000-0000-000000000000
,那么SQL Server只会将值插入到您的表中。
一种选择是从MVC项目中简单地生成自己的顺序GUID。 C#中有很多顺序GUID生成器的例子。我个人喜欢Alex Siepman顺序GUID解决方案,您可以在以下位置找到它: http://www.siepman.nl/blog/post/2015/06/20/SequentialGuid-Comb-Sql-Server-With-Creation-Date-Time-.aspx
或者,您可以在目标表上创建INSTEAD OF INSERT
触发器,以便以您希望的方式正确处理插入。在您的情况下,您要省略传递给表的ID,并让SQL Server为您生成ID。触发器将如下所示:
CREATE TRIGGER AutoGuid_Trigger ON [dbo].[YourTableName]
INSTEAD OF INSERT AS
BEGIN
INSERT INTO [dbo].[YourTableName]
(
-- Exclude ID from column list, SQL Server will generate the ID
[YourCol1]
,[YourCol2]
,[YourCol3]
,...
)
SELECT [YourCol1]
,[YourCol2]
,[YourCol3]
,...
FROM inserted
END