LINQ在IDENTITY列插入上插入NOT throw错误

时间:2015-08-07 14:14:24

标签: c# sql-server linq

我对LINQ中的这种行为感到困惑。当我尝试使用SQL将值插入IDENTIY列时,我收到错误。但是当我在LINQ中尝试时,我没有收到错误,并且忽略了插入值。

例如:

Table_1有2列。第一个ID'是一个IDENTITY(1,1)并在插入时递增。第2栏' TextColumn'是varchar(50)。如果我在SQL中运行以下查询:

insert into Table_1 (id,TextColumn) values (1,'test')

我按预期得到了这个错误:

  

无法在表格'表格1'中插入标识列的显式值   当IDENTITY_INSERT设置为OFF时。

但是当我在C#中运行此代码时,不会抛出任何错误:

var db = new TestDBDataContext();
var table1 = new Table_1();
table1.ID = 1; // SHouldn't this cause an error?
table1.TextColumn = "Test Text to insert";
db.Table_1s.InsertOnSubmit(table1);
db.SubmitChanges();

int值' 1'在这种情况下,只是被忽略,ID列自动递增。 以下是ID列

的designer.cs文件中的条目
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]

我很困惑为什么LINQ不会将这些值设置为" Read Only"默认情况下?如果我切换ID列的Read Only属性,我会得到预期的行为。在method.cs中,Set方法消失了ID对象,并在代码中出现错误。 谢谢!

2 个答案:

答案 0 :(得分:1)

你假设Linq2sql只是盲目地用table1中的值构建一个SQL语句。实际上它比这更复杂。例如,如果表格中有十列,并且您只为其中的5个分配了值,那么它只会在insert语句中包含这5列。

因此,因为它知道你不能在数据库中为ID赋值,所以它忽略了它在C#代码中这样做的事实。

答案 1 :(得分:1)

根据这篇文章,您的属性在您的实体定义中标记为Auto Generated Value,或者在安德烈在评论中建议的xml中标记为IsDBGenerated

https://stackoverflow.com/a/6139214/1729859