C# LINQ Insert未在标识列插入上引发错误

C# LINQ Insert未在标识列插入上引发错误,c#,sql-server,linq,C#,Sql Server,Linq,我对LINQ的这种行为感到困惑。当我试图使用SQL将一个值插入到一个IDENTIY列时,我得到了一个错误。但是当我在LINQ中尝试时,我没有得到错误,插入值被忽略 例如: 表1有两列。第一个“ID”是一个标识(1,1),在插入时递增。第2列“TextColumn”是一个varchar(50)。如果在SQL中运行以下查询: insert into Table_1 (id,TextColumn) values (1,'test') 我得到了预期的错误: 无法在表“table_1”中插入标识列的显式

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

例如:

表1有两列。第一个“ID”是一个标识(1,1),在插入时递增。第2列“TextColumn”是一个varchar(50)。如果在SQL中运行以下查询:

insert into Table_1 (id,TextColumn) values (1,'test')
我得到了预期的错误:

无法在表“table_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列通常自动递增。 以下是designer.cs文件中ID列的条目

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
我很困惑为什么LINQ在默认情况下不会将这些值设置为“只读”?如果切换ID列的只读属性,则会得到预期的行为。ID对象的Set方法在designer.cs中消失,代码中出现错误。
谢谢大家!

您假设Linq2sql只是盲目地从
表1
中的值构建SQL语句。事实上,这比这要复杂得多。例如,如果在表中添加了10列,并且只为其中5列赋值,则在
insert
语句中只会包含这5列


因此,由于它知道您不能在数据库中为
ID
赋值,它只是忽略了它在C#code中赋值的事实。

根据本文,您的属性在实体定义中标记为
自动生成值
,或者按照Andrei在评论中的建议,在xml中标记为
IsDBGenerated


您的上下文中的ID列上是否有类似于
IsDbGenerated
的属性或类似属性?是,设置为TRUE。这是我使用服务器资源管理器添加表时的默认设置。是否有理由它仍然允许我尝试设置table1.ID?似乎尝试设置一个值会抛出一个错误,就像您尝试使用SQL执行相同操作时一样。它忽略提供的值是否有具体原因?这似乎很容易忽略这类错误。没错,LINQ2sql理解不能直接写入ID列,因此问题不会发送到SQL server。但是我怎么知道如果我试图设置一个ID,它不会被丢弃呢?(每次未将ID设置为“自动生成”时都不进行检查)。对我来说,这似乎是一种奇怪的行为。我不得不想象这是有目的的,有很好的理由。我只是想了解这个原因。谢谢你的回答和帮助!谢谢你的帮助!