web-dev-qa-db-ja.com

EF 6.XのEntity Framework Code First Fluent APIのデフォルト値

BoolプロパティにEntityFramework Code First FluentAPIを使用してデフォルト値を設定するにはどうすればよいですか?

何かのようなもの:

Property(l => l.PropertyFlag).HasColumnType("bit").DefaultValue(1);
29
Tony Bao

幸いなことに、コードは最初にこれをサポートしています。生成された移行の「Up()」メソッドで、次の構文を使用してデフォルトを指定します。

AddColumn("[table name]", "[column name]", c => c.Boolean(nullable: false, defaultValue: false));

「AddColumn」メソッドのMSDN

31
htxryan

流な方法についてはわかりませんが、パラメーターなしのコンストラクターでプロパティを設定するだけです...

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

9
NinjaNye

ここでの別のオプションは、デフォルト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()";
        }
    }


}
2
gcoleman0828

以下の例を参照してください

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; }
}
0
Stefan Varga

EFには、デフォルト値や外部キーとしての一意キーなど、必要な機能がないため、ORMをEFからNHibernateに変更する必要があります。 NHibernateにはEF 6.Xよりも多くの機能があるように思えます。

0
Tony Bao