[英]LINQ Insert NOT throwing error on IDENTITY Column insert
我对LINQ中的这种行为感到困惑。 当我尝试使用SQL将值插入IDENTIY列时,出现错误。 但是,当我尝试使用LINQ时,不会出现错误,并且插入值将被忽略。
例如:
表_1有2列。 第一个“ ID”是IDENTITY(1,1),在插入时递增。 列2“ TextColumn”是varchar(50)。 如果我在SQL中运行以下查询:
insert into Table_1 (id,TextColumn) values (1,'test')
我按预期收到此错误:
当IDENTITY_INSERT设置为OFF时,无法为表'Table_1'中的标识列插入显式值。
但是,当我在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列的“只读”属性,则会得到预期的行为。 Set方法在ID对象的designer.cs中消失,并且代码中出现错误。 谢谢!
您假设Linq2sql只是根据table1
中的值盲目构建SQL语句。 实际上,它涉及的更多。 例如,如果您的表有10列,而您仅为其分配了5个值,则它将在insert
语句中仅包含这5列。
因此,由于它知道您无法为数据库中的ID
分配值,因此它只是忽略了在C#代码中这样做的事实。
在这篇文章中,您的属性在您的实体定义中被标记为“ Auto Generated Value
,或者在XML中被标记为IsDBGenerated
(如Andrei在注释中建议的那样)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.