当前位置: 首页 > 编程语言 > C#

如何确保LinqtoSql不会覆盖或违反不可为空的数据库默认值?

时间:2023-04-11 11:30:58 C#

如何确保LinqtoSql不会覆盖或违反不可为null的数据库默认值?我有一个带有这些字段的表的SQLServer数据库:默认值为1,NOTNULL。有默认值gettime()smalldatetime,NOTNULL。没有默认值的int,IDENTITY,NOTNULL。以下是我为该表生成LinqtoSQL时发生的情况:没有对该位进行特殊处理。smalldatetime没有得到特殊对待。int标志是IsDbGenerated。这意味着当我使用LinqtoSQL执行插入时,将发生以下情况:该位将作为0发送,覆盖默认值。正确的?smalldatetime将作为未初始化的System.DateTime发送,在SQLServer中产生错误,因为它不符合SQLServersmalldatetime范围。正确的?不会发送IsDbGeneratedint;数据库将生成一个LinqtoSQL将读回的值。我需要进行哪些更改才能使此方案生效?总结一下:我想要由数据库分配默认值的不可空字段,但我不希望它们是IsDbGenerated,如果这意味着我无法在使用LinqtoSQL更新或插入时给它们赋值。如果这意味着我必须手动将Linq生成的代码修改为SQL,我也不希望它们成为IsDbGenerated。编辑:答案似乎是这是LinqtoSQL的当前限制。Linq-To-Sql生成的类不选择默认的Constriants。也许在未来,但问题是约束并不总是简单的值,它们也可以是像GetDate()这样的标量函数,所以linq必须知道如何翻译它们。简而言之,它甚至不尝试。这也是一个非常特定于数据库的东西。您在CodeProject-SettingdefaultvaluesforLINQbounddata中详细说明了您遇到的问题我遇到了同样的问题,bzlm,得出了同样的结论。用LinqToSql使用DB赋默认值的不可空字段没有什么好办法。我所做的工作是添加一个SetDefaults()方法,该方法与CodeProject上链接的RobertPaulson方法非常相似,并在我的表实体基类的默认构造函数中调用它。它对我有用,因为95%的时间,我设置0、空字符串或getdate()。这意味着当我使用LinqtoSQL执行插入时,会发生以下情况:该位作为0发送,覆盖默认值。正确的?-正确的smalldatetime将作为未初始化的System.DateTime发送,在SQLServer中产生错误,因为它不符合SQLServersmalldatetime范围。正确的?-发送的是DateTime.MinValue不发送IsDbGeneratedint;数据库将生成一个LinqtoSQL将读回的值。-如果设置了数据库生成,数据库将创建该值,否则Linq期望用户设置该值。如果您不使用自动属性,最好的办法是在对象的构造函数或私有字段中设置它们。您可以为数据上下文(部分类)创建另一个文件,然后使用InsertYOURENTITY和UpdateYOURENTITY部分方法检查属性并分配正确的值。在您的代码之后调用ExecuteDynamicInsert或ExecuteDynamicUpdate并进行设置。以上就是C#学习教程:如何保证LinqtoSql不会覆盖或违反不可空的数据库默认值?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: