如何确保Linq到Sql不会;t覆盖或违反不可为null的DB默认值

本文关键字:默认值 DB null 覆盖 确保 何确保 Linq 不会 Sql | 更新日期: 2023-09-27 17:48:50

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

  1. 默认值为1的bit,即NOT NULL
  2. 默认值为gettime()NOT NULLsmalldatetime
  3. 一个没有默认值的intIDENTITYNOT NULL

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

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

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

  1. bit将被发送为0,覆盖默认值对吗
  2. smalldatetime将作为未初始化的System.DateTime发送,这将在SQL server中产生错误,因为它不属于SQL server smalldatetime范围对吗
  3. 不发送IsDbGenerated int;DB将生成一个值,然后Linq到SQL将读取该值

我需要做哪些更改才能使此场景正常工作

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

EDIT:答案似乎是这是当前Linq到SQL的一个限制

如何确保Linq到Sql不会;t覆盖或违反不可为null的DB默认值

Linq-To-Sql生成的类不会拾取默认值常量。

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

  • 您可以编写一个代码生成器来创建实体分部类,在那里您可以提取默认值constant
  • 或者,您的业务层代码可以从xml文件中设置构造函数中的默认值,您所需要做的就是保持xml文件的最新状态
  • 您可以在向数据库提交更改之前,通过检查ChangeSet来模拟sql并添加默认值,而不是在构造函数中进行操作

您遇到的问题在CodeProject-设置LINQ绑定数据的默认值

中有详细描述

我遇到了同样的问题bzlm,并得出了同样的结论。使用Linq-to-Sql时,没有很好的方法来获得具有DB分配的默认值的不可为null的字段。

我所做的工作是添加一个与Robert Paulson在CodeProject上链接的方法非常相似的SetDefault()方法,并在我的表实体基类的默认构造函数中调用它。它对我来说效果很好,因为95%的时候,我都在设置一个0、空字符串或getdate()。

这意味着,当我使用Linq-to-SQL进行插入时发生:

  1. 该位将作为0发送,覆盖默认值。对吧-正确
  2. smalldatetime将作为未初始化的系统发送。日期时间,自它不属于SQL Server小日期时间范围。对吧-发送的是DateTime。最小值
  3. 不会发送IsDbGenerated int;DB将生成一个值然后Linq to SQL将读取回。-如果设置了DB generated,则该值由数据库创建,如果没有,则Linq希望用户设置该值

如果不使用自动属性,最好在对象的构造函数中或在私有字段中设置它们。

您可以为您的数据上下文(分部类)创建另一个文件,然后使用InsertYOURENTITY和UpdateYOURENTITIY分部方法来检查您的属性并分配正确的值。在代码和设置完成后,调用ExecuteDynamicInsert或Execute DynamicUpdate。