SQL函数的主键值

时间:2012-11-08 17:12:43

标签: linq-to-sql

我在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

1 个答案:

答案 0 :(得分:1)

在DBML设计器中,将Auto Generated Value属性设置为该列的true。这应该可以解决问题。

检查this postthis thread in the MSDN forums