EntityFramework Code First FluentAPI DefaultValue в EF6.X

Как я могу установить значение по умолчанию, используя EntityFramework Code First FluentAPI для свойства bool?

Что-то вроде:

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

5 ответов

Хорошие новости, код сначала поддерживает это. В методе "Up()" сгенерированной миграции укажите значение по умолчанию со следующим синтаксисом:

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

MSDN для метода "AddColumn"

Я не уверен в беглом способе, но вы можете просто установить свойство в конструкторе без параметров...

public class MyTable
{
    public MyTable()
    {
        CanSetDefault = true;
    }

    public bool CanSetDefault {get; set; }
}

Обновить

Быстрый Google предполагает, что это не возможно, используя свободный 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.

Смотрите пример ниже

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; }
}
Другие вопросы по тегам