c# - 如何确保 Linq to Sql 不会覆盖或违反不可为 null 的数据库默认值?

标签 c# sql linq sql-server-2005 linq-to-sql

我有一个 SQL Server 数据库,其中的表包含以下字段:

  1. 默认值为 1 的 bitNOT NULL
  2. 具有默认值 gettime()smalldatetimeNOT NULL
  3. 一个没有默认值的 intIDENTITYNOT NULL

当我为此表生成 Linq to SQL 时,会发生以下情况:

  1. bit 没有特殊处理。
  2. smalldatetime 没有特殊处理。
  3. int 被标记为 IsDbGenerated

这意味着当我使用 Linq to SQL 进行插入时,将发生以下情况:

  1. bit 将作为 0 发送,覆盖默认值。 对吗?
  2. smalldatetime 将作为未初始化的 System.DateTime 发送,在 SQL Server 中产生错误,因为它不属于 SQL Server smalldatetime 范围。 对吗?
  3. IsDbGenerated int 不会被发送;数据库将生成一个值,然后 Linq to SQL 将读回该值。

我必须进行哪些更改才能使这种情况起作用?

总结一下:我想要具有 DB 分配的默认值的不可空字段,但我不想要它们 IsDbGenerated 如果这意味着我无法在使用 Linq 进行更新或插入时为它们提供值到 SQL。我也不希望它们 IsDbGenerated 如果这意味着我必须将 Linq 生成的代码手动修改为 SQL。

编辑:答案似乎是这是当前 Linq to SQL 的限制。

最佳答案

Linq-To-Sql 生成的类不选择默认值约束。

也许在未来,但问题是约束并不总是简单的值,它们也可以是标量函数,例如 GetDate(),因此 linq 必须知道如何转换这些值。简而言之,它甚至不尝试。它也是一种非常特定于数据库的类型。

  • 您可以编写代码生成器来创建实体分部类,您可以在其中提取默认值约束。
  • 或者,您的业务层代码可以通过 xml 文件在构造函数中设置默认值,您需要做的就是使 xml 文件保持最新。
  • 您可以模拟 sql 并通过在将更改提交到数据库之前检查 ChangeSet 添加默认值,而不是在构造函数中执行这些工作。

您遇到的问题在 CodeProject - Setting Default Values for LINQ Bound Data 中有详细描述。

关于c# - 如何确保 Linq to Sql 不会覆盖或违反不可为 null 的数据库默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/201706/

相关文章:

c# - 构造函数 block 是可以接受的样式吗?

javascript - MVC 将 json 数据传递给 Controller

c# - Entity Framework 5,从代码优先切换到数据库优先?

sql - 在一个查询中更新和选择

sql - 插入组合(值和选择)

c# - 按组后排序?

c# - NULL 数组上的笛卡尔

c# - 奇怪的日期时间解析错误

mysql - 以 "0"为值的 SQL 列

c# - Linq:计算行组,包括 0 行缺失行