我有一个表添加了一些新列,它们允许空值准确地容纳现有数据。在创建这些记录时,新列不存在,因此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;
}
}
这确实有效,但我有一种唠叨的感觉,那里有一个更清洁的解决方案。
答案 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。