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