我正在将一个草率的旧Access数据库移动到一个清晰的新SQL Server数据库,并使用EF Code First来设计和管理数据库。
我开始锁定所有我不想成为空的东西,但后来我得到了粗糙的旧数据,发现在很多地方的旧数据中都有空值。我无法从历史记录中重新创建旧数据,所以我想我需要在新数据库中允许空值。
...但我绝对想要防止任何更邋data的数据进入数据库。如果我输入[Required]属性,它将阻止新的坏数据,但它也会将db列创建为NOT NULL,从而阻止旧数据的迁移。
那么如何锁定数据库以防止新的空值进入呢?当然我可以保护UI以防止它,但我有点偏执,并希望锁定DB以不允许新行具有空值。执行此操作的一种方法是,如果Inserted行在我要保护的列中包含空值,则返回EF并编写触发器以抛出异常。这样可行,但我想知道是否有一些方法可以直接在EF中进行,并且维护的代码较少。
答案 0 :(得分:1)
您所考虑的解决方案有一个不同的解决方案:导入数据时,将旧的空值转换为新的特殊值。通过这种方式,您可以获得数据库中没有空值的所有好处。这不是您正在寻找的,但我在将数据导入新应用程序时已经完成了,我认为您也可以使用此解决方案。当我导入丢失或无效的数据时,我将其转换为特殊值,我通常称之为#34;历史性"。
要回答您的具体问题,如果您想在EF中进行自定义验证,可以使用以下几种解决方案:
如果您使用这些解决方案之一,您必须考虑的一件事是,如果用户尝试更新数据库中具有空值的某些数据,并且他想保留空值,则验证必须知道那,或者它会再次显示旧的null字段的错误。在这个答案中提出的第一个解决方案并没有出现这个问题。