【发布时间】:2015-08-07 14:14:24
【问题描述】:
我对 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')
我按预期收到此错误:
无法为表“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 对象的 Designer.cs 中的 Set 方法消失,并且代码中出现错误。 谢谢!
【问题讨论】:
-
您的上下文中的 ID 列上是否有类似
IsDbGenerated或类似属性的内容? -
是的,设置为 TRUE。这是我使用服务器资源管理器添加表时的默认设置。它仍然允许我尝试设置 table1.ID 是否有原因?似乎尝试设置一个值会引发错误,就像您尝试使用 SQL 执行相同操作一样。它忽略提供的值是否有特定原因?似乎很容易忽略这种类型的错误。
标签: c# sql-server linq