我想在将新记录插入数据库之前设置一个标识字段的值,我试图保存,当我知道目标表已经为空时,不必重新映射所有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");
答案 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字段。