BoolプロパティにEntityFramework Code First FluentAPIを使用してデフォルト値を設定するにはどうすればよいですか?
何かのようなもの:
Property(l => l.PropertyFlag).HasColumnType("bit").DefaultValue(1);
幸いなことに、コードは最初にこれをサポートしています。生成された移行の「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()";
}
}
}
以下の例を参照してください
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Rating)
.HasDefaultValue(3);
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public int Rating { get; set; }
}
EFには、デフォルト値や外部キーとしての一意キーなど、必要な機能がないため、ORMをEFからNHibernateに変更する必要があります。 NHibernateにはEF 6.Xよりも多くの機能があるように思えます。