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(值)