我对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对象,并在代码中出现错误。 谢谢!
答案 0 :(得分:1)
你假设Linq2sql只是盲目地用table1
中的值构建一个SQL语句。实际上它比这更复杂。例如,如果表格中有十列,并且您只为其中的5个分配了值,那么它只会在insert
语句中包含这5列。
因此,因为它知道你不能在数据库中为ID
赋值,所以它忽略了它在C#代码中这样做的事实。
答案 1 :(得分:1)
根据这篇文章,您的属性在您的实体定义中标记为Auto Generated Value
,或者在安德烈在评论中建议的xml中标记为IsDBGenerated
。