如何在实体框架

时间:2017-05-08 19:21:59

标签: c# asp.net entity-framework

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

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

我想尽可能靠近数据库这样做,所以我在setter中放了一些验证码。

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

这确实有效,但我有一种唠叨的感觉,那里有一个更清洁的解决方案。

2 个答案:

答案 0 :(得分:0)

这个问题的答案是" Default value for Required fields in Entity Framework migrations?"帮帮你?

您必须定义defaultValueSql,以便可以使用所有NULL值。

答案 1 :(得分:0)

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

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

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