【问题标题】:How to enforce new data integrity rules in Entity Framework如何在实体框架中实施新的数据完整性规则
【发布时间】:2017-10-06 22:23:41
【问题描述】:

我有一个添加了一些新列的表,它们允许空值准确地容纳现有数据。在创建这些记录时,新列不存在,因此 null 准确地表示了当时数据库的状态。对于所有新数据,我不想允许空值。管理它的最佳做法是什么?

如果我在EntityTypeConfiguration 类中使用.IsRequired(),它将尝试更改表以使列不可为空,并在遇到历史空值时失败。我仍然希望能够读取那些旧记录,我只是不想写任何没有新列的新记录。

我想在尽可能靠近数据库的地方执行此操作,因此我在 setter 中放置了一些验证代码。

    private string _CountryCode;
    public string CountryCode
    {
        get
        {
            return _CountryCode;
        }
        set
        {
            if (string.IsNullOrEmpty(value))
                throw new ArgumentException("Country Code Required");
            _CountryCode = value;
        }
    }

这确实有效,但我总觉得那里有更清洁的解决方案。

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

    正确的方法是使用IsRequired(),因为对于 EF,它要么是必需的,要么不是。如果不在那里是可以接受的,那就是:不需要。

    为我处理它的方法是迁移以前的数据,但如果您决定不这样做,您的解决方案似乎是处理它的好方法,但是,您当前的 setter 对我来说看起来很奇怪。例如,如果我实例化该类并执行myObject.CountryCode = "AA";,我会得到一个异常,因为在我设置之前的 current 值是 null 或空白。听起来很错误。也许您应该改为测试value

    附带说明,我见过的大多数使用 EF 的公司系统都会阻止 EF 自动更改数据库。在您的DbContext 中使用Database.SetInitializer<YourContextClass>(null); 以防止它在您的生产环境中自动执行此操作是常见的(但不是普遍的)做法。您仍然可以在某些情况下调用这些方法来强制更新数据库结构,或者使用数据库项目生成的 dacpacs。

    【讨论】:

    • 糟糕。应该是 IsNullOrEmpty(value)
    【解决方案2】:

    这个问题的答案“Default value for Required fields in Entity Framework migrations?”对你有帮助吗?

    您必须定义一个 defaultValueSql,以便所有 NULL 值都成为必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多