我有一个使用EF和代码优先的MVC项目。
我有一个模型PropBase和一个模型MyProp - 它们被映射到同一个表(自动" Discriminator"列)。
我向MyProp添加了两个属性 - prop1和prop2:
public class PropBase
{
public double Prop0 { get; set; }
}
public class MyProp: PropBase
{
public double Prop10 { get; set; }
public double Prop1{ get; set; } // new property
public int Prop2{ get; set; } // new property
}
我还添加了一个新的迁移:
public partial class AddProps12 : DbMigration
{
public override void Up()
{
AddColumn("dbo.Props", "Prop1", c => c.Double(nullable: true, defaultValue: 0));
AddColumn("dbo.Props", "Prop2", c => c.Int(nullable: true, defaultValue: 0));
}
public override void Down()
{
DropColumn("dbo.Props", "Prop1");
DropColumn("dbo.Props", "Prop2");
}
}
但是当我运行应用程序时 - 新的列添加了 null 并且在行
return m_myPropsRepository.AsQueryable().ToList();
我收到此错误
' Prop1'物业在' MyProp'无法设置为' null'值。 您必须将此属性设置为类型为' Double'的非空值。
我不能使用nullable:false,因为当我向表中插入新的PropBase时 - 它不知道Prop1和Prop2因此插入NULL然后我得到一个错误,因为我将其定义为不可为空。
我需要一种方法来做可空的 AND ,将0作为默认值放到当前的MyProp行。
答案 0 :(得分:1)
好的......使用如下
AddColumn("dbo.Props", "Prop2", c => c.Int(nullable: false, defaultValue: 0));
在代码中设置nullable:false
答案 1 :(得分:1)
请尝试
AddColumn("dbo.Props", "Prop1", c => c.Double());
AddColumn("dbo.Props", "Prop2", c => c.Int());
Sql("UPDATE dbo.Props SET Prop1 = 0, Prop2 = 0 WHERE Discriminator = 'MyProp'");
我们的想法是使用Discriminator“MyProp”更新数据库表中的旧值而不是null值
答案 2 :(得分:0)
您在db(nullable:true)中将两个字段添加为nullable,但您的模型(对象)将这些类型声明为非可空。所以EF试图为非nulalble属性分配一个空值。使对象属性nulallbe如此:
public class MyProp: PropBase
{
public double Prop10 { get; set; }
public double? Prop1{ get; set; } // new property
public int? Prop2{ get; set; } // new property
}
或者您必须在数据库中创建非nullalbe(nullable:false)列。
如果你想要它可以为空但仍然需要默认值0那么你可以做这样的事情:
public class MyProp: PropBase
{
private double? _prop1;
private double? _prop2;
public double Prop10 { get; set; }
public double? Prop1
{
get
{
if(!this._prop1.HasValue)
this._prop1 = 0;
return this._prop1;
}
set
{
this._prop1 = value;
}
}
public int? Prop2
{
get
{
if(!this._prop2.HasValue)
this._prop2 = 0;
return this._prop2;
}
set
{
this._prop2 = value;
}
}
}