【问题标题】:LINQ Insert NOT throwing error on IDENTITY Column insertLINQ 插入未在 IDENTITY 列插入时引发错误
【发布时间】: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


【解决方案1】:

您假设 Linq2sql 只是盲目地根据 table1 中的值构建 SQL 语句。它实际上比这更多。例如,如果您在表中创建了十列,并且您只为其中的 5 列赋值,那么它只会在 insert 语句中包含这 5 列。

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

【讨论】:

  • 这是真的,LINQ2sql 理解不能直接写入 ID 列,因此问题不会发送到 SQL 服务器。但是我怎么知道我是否尝试设置一个不会被丢弃的 ID? (无需每次都检查 ID 未设置为自动生成)。这对我来说似乎是一种奇怪的行为。我不得不想象这是有充分理由故意这样做的。我只是想了解这个原因。感谢您的回答和帮助!
【解决方案2】:

根据这篇文章,您的属性在实体定义中被标记为Auto Generated Value,或者在 xml 中被标记为 IsDBGenerated,正如 Andrei 在 cmets 中所建议的那样。

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

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多