C# 如何在实体框架中实施新的数据完整性规则
我有一个表,其中添加了一些新列,它们允许空值精确地容纳现有数据。在创建这些记录时,新列不存在,因此空值准确地表示当时数据库的状态。对于所有新数据,我不希望允许空值。管理这一点的最佳做法是什么 如果在C# 如何在实体框架中实施新的数据完整性规则,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个表,其中添加了一些新列,它们允许空值精确地容纳现有数据。在创建这些记录时,新列不存在,因此空值准确地表示当时数据库的状态。对于所有新数据,我不希望允许空值。管理这一点的最佳做法是什么 如果在EntityTypeConfiguration类中使用.IsRequired(),它将尝试更改表以使列不可为null,并在遇到历史null时失败。我仍然希望能够阅读那些旧记录,我只是不想在没有新列的情况下写任何新记录 我希望在尽可能靠近数据库的地方执行此操作,因此我在setter中添加了一些验证代码
EntityTypeConfiguration
类中使用.IsRequired()
,它将尝试更改表以使列不可为null,并在遇到历史null时失败。我仍然希望能够阅读那些旧记录,我只是不想在没有新列的情况下写任何新记录
我希望在尽可能靠近数据库的地方执行此操作,因此我在setter中添加了一些验证代码
private string _CountryCode;
public string CountryCode
{
get
{
return _CountryCode;
}
set
{
if (string.IsNullOrEmpty(value))
throw new ArgumentException("Country Code Required");
_CountryCode = value;
}
}
这确实管用,但我总觉得有一个更干净的解决办法。这个问题的答案“对你有帮助吗?”
您必须定义defaultValueSql,以便所有空值都成为必需值。此问题的答案“是否有帮助?”
您必须定义defaultValueSql,以便所有空值都成为必需值。正确的方法是使用
IsRequired()
,因为对于EF,它要么是必需的,要么不是。如果不在那里是可以接受的,那就是:不需要
对我来说,处理它的方法是迁移以前的数据,但是如果您决定不这样做,您的解决方案似乎是处理它的好方法,但是,您当前的setter在我看来非常奇怪。例如,如果我实例化该类,并执行myObject.CountryCode=“AA”代码>,我会得到一个异常,因为我的集合之前的当前值为null或空。听起来是错误的。也许你应该改为测试值
另一方面,我看到的大多数使用EF的公司系统都会阻止EF自动更改数据库。使用Database.SetInitializer(null)是常见的(但不是通用的)在DbContext
中执行code>以防止它在生产环境中自动执行此操作。在某些情况下,您仍然可以调用这些方法来强制更新数据库结构,或者使用数据库项目生成的DACPAC。正确的方法是使用IsRequired()
,因为对于EF,它要么是必需的,要么不是。如果不在那里是可以接受的,那就是:不需要
对我来说,处理它的方法是迁移以前的数据,但是如果您决定不这样做,您的解决方案似乎是处理它的好方法,但是,您当前的setter在我看来非常奇怪。例如,如果我实例化该类,并执行myObject.CountryCode=“AA”代码>,我会得到一个异常,因为我的集合之前的当前值为null或空。听起来是错误的。也许你应该改为测试值
另一方面,我看到的大多数使用EF的公司系统都会阻止EF自动更改数据库。使用Database.SetInitializer(null)是常见的(但不是通用的)在DbContext
中执行code>以防止它在生产环境中自动执行此操作。在某些情况下,您仍然可以调用这些方法来强制更新数据库结构,或者使用数据库项目生成的DACPAC。Oops。它应该是IsNullOrEmpty(value)Oops。它应该是IsNullOrEmpty(值)