【问题标题】:Linq-to-SQL ignores SQL Server default valueLinq-to-SQL 忽略 SQL Server 默认值
【发布时间】:2009-07-13 17:17:26
【问题描述】:

使用 Linq-to-SQL 时,向现有表添加列,并在该新列上设置默认值,Linq to SQL 似乎忽略了默认值。 有没有其他人经历过这种行为?有没有办法修复它,让 Linq-to-SQL 或 SQL Server 自动设置默认值?

我添加的列是Bit类型,默认值设置为1。

【问题讨论】:

标签: sql-server-2005 linq-to-sql


【解决方案1】:

我现在已经通过使用来自 this blog 的示例明确地解决了这个问题。

partial void OnCreated() {
    if (this.DateTimeCreated == null) {
           this.DateTimeCreated = DateTime.Now;
    }
}

我需要将其传递给部分数据上下文类,因为每次更改 dbml 中的某些内容时都会自动覆盖默认的。

【讨论】:

  • 我的解决方案不能解决问题吗?
  • 您的解决方案适用于插入,但是当我更新记录时,我收到关于无法更改数据库中生成的某些成员的错误
  • 这对我来说效果最好,因为当我修改一个表并在 linq-to-sql dbml 文件中重新生成它时,我丢失了我在表中的字段上设置的所有自定义属性,导致模糊我的网站中的错误。在单独的类文件中创建部分 OnCreated 方法可以避免这种情况。
【解决方案2】:

将自动生成属性设置为 True。

【讨论】:

  • 这不起作用。如果您总是想使用默认值,它会起作用,但它不会让您在插入对象时使用非默认值。 Linq2Sql 将忽略您提供的值并读回默认值。
【解决方案3】:

进入设计器并选择“OnInsert”的“Auto-Sync”值。这将在记录插入数据库时​​同步值。

【讨论】:

  • 请参阅intrepidstudios.com/blog/2009/2/6/… 了解更多信息。这是最终的方法。
  • 这不起作用。它不会让您在插入对象时省略该值。如果这样做,它将尝试插入 null 作为列值,而正确的操作是在查询中根本不列出任何值。因此,当该列不可为空时,您会收到“无法将空值插入不可为空的列”错误。
  • 很公平。整个事情看起来并没有一个干净的解决方案(即使接受的答案也有点像黑客)。 L2S 不能正确处理这种情况。
【解决方案4】:

我见过这个。您可以做的是进入 l2sql 设计器,查看具有默认值的表列的属性。有一个属性“自动生成的值”,设置为true。

对于标识列,这个相同的值会自动设置为 true,因为在这种情况下 SQL Server 正在生成您的行 ID。

【讨论】:

  • 这不起作用,因为我需要在之后更新该列。当我尝试您的解决方案时,出现错误:“无法更改在数据库中计算或生成的成员”
  • 那太糟糕了。我从未尝试过使用稍后要更改的字段(我将它用于 DateCreated 列)。即使在那种情况下,我还是决定不使用 SQL 默认值并在我的代码中明确设置它——推理是我的域逻辑的一部分,因此它属于我的域逻辑代码的其余部分。
  • 我认为我得到的错误是 Linq-to-sql 中的错误。 “自动生成值”的工具提示说“插入时自动生成值”
【解决方案5】:

我遇到了同样的布尔数据类型问题,默认为 false 并且不更新该值 所以当我看到数据库表时,我发现没有设置主键,因此当我设置主键时它被更新了。 所以检查一个表是否有主键。

【讨论】:

    【解决方案6】:

    如果您需要更改自己代码中的值(例如,具有默认值的类型表值),请不要使用“自动生成值”,否则您稍后会在尝试更新它时得到它。

    类型对象的成员“AlternativeQuoteStatus”的值 “订单详情”已更改。由计算或生成的成员 无法更改数据库。

    我更喜欢在创建对象时设置此类值,并在 OnCreated 中回退,正如其他人在此处所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多