Linq to sql 来自SQL函数的主键值

Linq to sql 来自SQL函数的主键值,linq-to-sql,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 FRO

我在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,列不允许为Null

在我的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中拥有一个自动生成的主键属性,该属性在底层SQL中不使用标识列?有没有其他方法可以产生同样的结果


注意:我希望避免更改应用程序代码。理想情况下,将现有表从使用线性增量主键更改为随机生成的主键时,这应该可以正常工作。

在DBML设计器中,将该列的
自动生成值
属性设置为
true
。这应该能奏效


检查一下,在我的帖子中你会看到它已经设置为true。问题是LINQ to SQL假定它是一个标识插入,并尝试使用SCOPE_identity()获取自动生成的值。