我有一个 SQL Server 数据库,其中的表包含以下字段:
- 默认值为 1 的
bit
,NOT NULL
。 - 具有默认值
gettime()
的smalldatetime
,NOT NULL
。 - 一个没有默认值的
int
,IDENTITY
,NOT NULL
。
当我为此表生成 Linq to SQL 时,会发生以下情况:
bit
没有特殊处理。smalldatetime
没有特殊处理。int
被标记为IsDbGenerated
。
这意味着当我使用 Linq to SQL 进行插入时,将发生以下情况:
bit
将作为 0 发送,覆盖默认值。 对吗?smalldatetime
将作为未初始化的System.DateTime
发送,在 SQL Server 中产生错误,因为它不属于 SQL Server smalldatetime 范围。 对吗?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/