在linq-to-sql中指定标识值

时间:2010-10-17 03:34:38

标签: linq linq-to-sql identity

我想在将新记录插入数据库之前设置一个标识字段的值,我试图保存,当我知道目标表已经为空时,不必重新映射所有FK字段。

我原本希望这个问题: How do I MANUALLY set an Identity field in LINQ-To-SQL (IDENTITY INSERT) 我会回答我的问题,但看了之后,接受的答案似乎仍无法提供直截了当的答案。

字段定义是:

[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'中为标识列插入显式值”。异常。

即使使用以下内容也无济于事:

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

1 个答案:

答案 0 :(得分:2)

解决方案是在使用该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_INSERT不起作用。但请记住在完成后关闭SQL连接。此外,更改字段定义将使您在正常插入时不会更新ID字段。