【问题标题】:Why is LINQ's default ID(Primary Key) ReadOnly=False?为什么 LINQ 的默认 ID(Primary Key) ReadOnly=False?
【发布时间】:2015-08-11 12:27:00
【问题描述】:

如果我在 MS SQL 数据库中创建一个表,其 ID 列设置为标识、自动增量和主键。为什么使用此列的只读属性创建的关联 LINQ 对象设置为 False?这使得您可以在 LINQ 中插入 ID,但实际上提供给 ID 字段的值只是被丢弃,并且数据库自动为该列编号。尝试插入时 LINQ 不会产生错误。

LINQ 中的 ID 列显示为:

自动生成值 = True

主键 = 真

Read Only = False(为什么?无法将值插入数据库!)

我可以理解,SQL 中的 ID 值设置为允许插入。但在这种情况下,这些值会被忽略,不会引发错误。这种类型的自动生成列的只读值没有默认设置为 True 是否有原因?

谢谢!

【问题讨论】:

  • 你指的是哪个属性?阅读并展示相关的 MSDN 文章。如果我查看ColumnAttributes,则没有ReadOnly 属性。

标签: c# sql-server database linq


【解决方案1】:

仅仅因为一个值是自动生成的,并不意味着您不能手动插入它。您需要做的就是运行以下命令:

SET IDENTITY_INSERT table ON

Linq 无法确定您不允许的身份插入,特别是因为通常只为几个语句打开它然后将其关闭,所以默认情况下它似乎允许您。如果您作为程序员知道得更多,只需关闭标志即可。

【讨论】:

  • 我还认为他指的是DataSet 列的属性ReadOnly。为什么不允许在自动生成的列上使用属性设置器?如果它适合您的业务逻辑,您可以将其设置为 0、-1、-2 或 int.MinValue。数据库将自动生成新值并不重要。 DataSet 是您数据的内存存储。
  • 另外,我认为DataColumnReadOnly 属性仅在一种情况下自动成为true:计算列。我已经在DataSet 中对其进行了测试。在我分配了一个表达式后,它变为ReadOnly=true
  • 我想这就是我一直在寻找的答案! LINQ 无法检测标识字段中是否允许插入。因此它默认允许插入。您还提供了一个合乎逻辑的理由,将其设为默认值,这是我真正难以掌握的。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多