web-dev-qa-db-fra.com

Valeur par défaut de l'API Fluent First Code Entity Framework dans EF6.X

Comment définir la valeur par défaut avec la propriété EntityFramework Code First FluentAPI for bool?

Quelque chose comme:

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

Bonne nouvelle, le code en premier supporte maintenant cela. Dans la méthode "Up ()" de la migration générée, spécifiez une valeur par défaut avec la syntaxe suivante:

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

MSDN pour la méthode "AddColumn"

29
htxryan

Je ne suis pas sûr de pouvoir parler couramment, mais vous pouvez simplement définir la propriété dans un constructeur sans paramètre ...

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

    public bool CanSetDefault {get; set; }
}

Mettre à jour

Un rapide google suggère qu'il n'est pas possible d'utiliser une api fluide ...
http://social.msdn.Microsoft.com/Forums/en-US/ad854e28-02f5-451b-9000-c8bcb1355d0b/codefirst-ctp5-and-default-values?forum=adonetefx

9
NinjaNye

Une autre option consiste à remplacer la classe par défaut SqlServerMigrationSqlGenerator par la vôtre. Vous pouvez ensuite injecter certains éléments souhaités dans la méthode Generate (par exemple, les valeurs par défaut). Ce qui est bien avec cela, c'est que vous pouvez également l'utiliser dans d'autres applications, car c'est assez générique. Ici est une bonne explication à ce sujet.

 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()";
        }
    }


}
1
gcoleman0828

Comme EF ne possède pas les fonctions dont j'ai besoin, telles que les valeurs par défaut et la clé unique en tant que clé étrangère, nous devons modifier l'ORM de EF à NHibernate. Il me semble que NHibernate a plus de fonctions que EF 6.X. 

1
Tony Bao

Voir exemple ci-dessous

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