在linq to sql中指定标识值

在linq to sql中指定标识值,linq,linq-to-sql,identity,Linq,Linq To Sql,Identity,我试图在将新记录插入数据库之前设置标识字段的值,我试图避免在知道目标表已为空时不必要地重新映射所有FK字段 我曾希望这个问题: 我会回答我的问题不管你怎么看,公认的答案似乎仍然不能提供一个直截了当的答案 字段定义为: [Column(Storage = "_ID", AutoSync = AutoSync.OnInsert, DbType = "BigInt NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] p

我试图在将新记录插入数据库之前设置标识字段的值,我试图避免在知道目标表已为空时不必要地重新映射所有FK字段

我曾希望这个问题: 我会回答我的问题不管你怎么看,公认的答案似乎仍然不能提供一个直截了当的答案

字段定义为:

[Column(Storage = "_ID", AutoSync = AutoSync.OnInsert, DbType = "BigInt NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
    public long ID
    {
        get {}
        set {}
    }
但是,所有这一切都是忽略任何设置值,只使用数据库中的下一个值。我发现,将IsDbGenerated更改为false只能成功地使应用程序抛出“当identity_insert设置为OFF时,无法为表'Project'中的identity列插入显式值。”异常

即使使用以下方法也无济于事:

newDb.ExecuteCommand("SET IDENTITY_INSERT Contact ON");
newDb.SubmitChanges();
newDb.ExecuteCommand("SET IDENTITY_INSERT Contact OFF");

解决方案是在使用SqlConnection创建MappingSource之前使用SqlConnection并调用.Open()

然后,您需要做的就是在字段定义中将IsDbGenerated设置为false

因此,来自:

MyDatabaseDataContext newDb = new MyDatabaseDataContext();
var query = from u in newDb .Users
    where u.email == txtEmail.Text
    select u;
变成:

SqlConnection con = new SqlConnection();
con.Open();
MyDatabaseDataContext newDb = new MyDatabaseDataContext(con);
var query = from u in newDb.Users
    where u.email == txtEmail.Text
    select u;

否则,它将使用自己的内部SQL连接池,而您的
IDENTITY\u INSERT
无法工作。但请记住在完成后关闭SQL连接。此外,更改字段定义将使其在正常插入时不会更新ID字段。

此答案也没有帮助。这并不能说明当您要临时手动设置一行数据的标识值或永久设置标识值时,这是否有效。修改DLinq类文件意味着这将成为一种永久性行为,但答案不清楚这是目的还是意图。此外,没有为解决方案提供示例代码。我认为它非常清楚,但对于不知道如何创建
SqlConnection
对象并在所述sql连接上创建映射源的人来说,它已经更新了。