繁体   English   中英

LINQ插入不会在IDENTITY列插入上引发错误

[英]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在注释中建议的那样)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM