迁移中的默认值不起作用
defaultValue in migration doesn't work
我有一个使用 EF 和代码优先的 MVC 项目。
我有一个模型 PropBase 和一个模型 MyProp - 它们映射到相同的 table(具有自动 "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();
我收到这个错误
The 'Prop1' property on 'MyProp' could not be set to a 'null' value.
You must set this property to a non-null value of type 'Double'.
我不能使用 nullable:false,因为当我向 table 插入一个新的 PropBase - 它不知道 Prop1 和 Prop2,因此插入 NULL 然后我得到一个错误,因为我将其定义为不可为空。
我需要一种方法让它可以为空 AND 将 0 作为当前 MyProp 行的默认值。
您在数据库中将这两个字段添加为可为空 (nullable: true),但您的模型(对象)将这些类型声明为不可为空。所以 EF 试图为非 nullalble 属性分配一个空值。使对象属性 nulallbe 像这样:
public class MyProp: PropBase
{
public double Prop10 { get; set; }
public double? Prop1{ get; set; } // new property
public int? Prop2{ get; set; } // new property
}
或者您必须使数据库中的列非空(可空: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;
}
}
}
好的...像下面这样使用
AddColumn("dbo.Props", "Prop2", c => c.Int(nullable: false, defaultValue: 0));
在您的代码中设置 nullable:false
请尝试
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'");
我们的想法是用非空值更新来自 DB table 的旧值和 Discriminator "MyProp"
我有一个使用 EF 和代码优先的 MVC 项目。
我有一个模型 PropBase 和一个模型 MyProp - 它们映射到相同的 table(具有自动 "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();
我收到这个错误
The 'Prop1' property on 'MyProp' could not be set to a 'null' value. You must set this property to a non-null value of type 'Double'.
我不能使用 nullable:false,因为当我向 table 插入一个新的 PropBase - 它不知道 Prop1 和 Prop2,因此插入 NULL 然后我得到一个错误,因为我将其定义为不可为空。
我需要一种方法让它可以为空 AND 将 0 作为当前 MyProp 行的默认值。
您在数据库中将这两个字段添加为可为空 (nullable: true),但您的模型(对象)将这些类型声明为不可为空。所以 EF 试图为非 nullalble 属性分配一个空值。使对象属性 nulallbe 像这样:
public class MyProp: PropBase
{
public double Prop10 { get; set; }
public double? Prop1{ get; set; } // new property
public int? Prop2{ get; set; } // new property
}
或者您必须使数据库中的列非空(可空: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;
}
}
}
好的...像下面这样使用
AddColumn("dbo.Props", "Prop2", c => c.Int(nullable: false, defaultValue: 0));
在您的代码中设置 nullable:false
请尝试
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'");
我们的想法是用非空值更新来自 DB table 的旧值和 Discriminator "MyProp"