我在SQL中编写了一个用户定义的函数来生成随机整数以用作主键:
CREATE VIEW [dbo].[GetNewID]
AS
SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS new_id;
CREATE FUNCTION [dbo].[RandomID] ()
RETURNS INT
AS
BEGIN
DECLARE @new_id AS INT
SET @new_id = (SELECT new_id FROM GetNewID)
IF (SELECT COUNT(*) FROM Foo WHERE FooID = @new_id) != 0
SELECT @new_id = [dbo].[RandomID]()
RETURN @new_id
END;
使用下表:
CREATE TABLE [dbo].[Foo] (
[FooID] [int] PRIMARY KEY DEFAULT([dbo].[RandomID]()),
[val] [varchar](32)
);
使用SQL插入记录按预期工作。
但是当尝试使用LINQ创建新记录时,我收到以下错误:
无法将值Null插入列id,列不允许空值
在我的LINQ to SQL模型中,FooID
具有以下列属性:
[ColumnAttribute(Storage="_FooID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
如果我检查LINQ生成的SQL,问题很明显:
INSERT INTO [dbo].[Foo]([val])
VALUES (@p0)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [Testing]
LINQ正在尝试从身份插入中获取最后一个值,该值将返回null。
所以我想这个问题归结为;我可以在LINQ中使用自动生成的主键属性 NOT 在基础SQL中使用标识列吗?我可以采取另一种可以产生相同结果的方法吗?
注意:我想避免更改应用程序代码。理想情况下,在将现有表格从使用线性增量主键更改为随机生成的主键时,应该 Just Work 。
答案 0 :(得分:1)
在DBML设计器中,将Auto Generated Value
属性设置为该列的true
。这应该可以解决问题。