我该如何使用EntityFramework Code First FluentAPI设置布尔属性的默认值?
类似这样:
Property(l => l.PropertyFlag).HasColumnType("bit").DefaultValue(1);
Property(l => l.PropertyFlag).HasColumnType("bit").DefaultValue(1);
好消息,Code First 现在支持此功能。在生成的迁移的 "Up()" 方法中,使用以下语法指定默认值:
AddColumn("[table name]", "[column name]", c => c.Boolean(nullable: false, defaultValue: false));
我不确定是否有一种流畅的方式,但你可以在一个无参构造函数中简单设置属性...
public class MyTable
{
public MyTable()
{
CanSetDefault = true;
}
public bool CanSetDefault {get; set; }
}
更新
快速搜索发现不能使用流畅API......
http://social.msdn.microsoft.com/Forums/en-US/ad854e28-02f5-451b-9000-c8bcb1355d0b/codefirst-ctp5-and-default-values?forum=adonetefx
另一个选择是使用自己的类来覆盖默认的SqlServerMigrationSqlGenerator类。您可以在Generate方法中注入某些要发生的事情(例如默认值)。优点是,您还可以在其他应用程序中使用它,因为它非常通用。 这里有一份详细的说明。
internal class CustomSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator
{
protected override void Generate(AddColumnOperation addColumnOperation)
{
SetCreatedUtcColumn(addColumnOperation.Column);
base.Generate(addColumnOperation);
}
protected override void Generate(CreateTableOperation createTableOperation)
{
SetCreatedUtcColumn(createTableOperation.Columns);
base.Generate(createTableOperation);
}
private static void SetCreatedUtcColumn(IEnumerable<ColumnModel> columns)
{
foreach (var columnModel in columns)
{
SetCreatedUtcColumn(columnModel);
}
}
private static void SetCreatedUtcColumn(PropertyModel column)
{
if (column.Name == "CreatedUtc")
{
column.DefaultValueSql = "GETUTCDATE()";
}
}
}
由于EF没有我需要的功能,例如默认值和唯一键作为外键,我们必须将ORM从EF更改为NHibernate。在我看来,NHibernate比EF 6.X拥有更多的功能。