webentwicklung-frage-antwort-db.com.de

Entity Framework Code Erster fließender API-Standardwert in EF6.X

Wie kann ich den Standardwert mithilfe von EntityFramework Code First FluentAPI für die Eigenschaft bool festlegen?

So etwas wie:

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

Gute Nachrichten, Code zuerst unterstützt dies jetzt. Geben Sie in der Methode "Up ()" der generierten Migration einen Standard mit der folgenden Syntax an:

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

MSDN für "AddColumn" -Methode

29
htxryan

Ich bin nicht sicher, was einen fließenden Weg bedeutet, aber Sie können die Eigenschaft einfach in einem parameterlosen Konstruktor festlegen ...

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

    public bool CanSetDefault {get; set; }
}

Update

Ein schneller Google-Hinweis deutet darauf hin, dass es nicht möglich ist, die fließende ...
http://social.msdn.Microsoft.com/Forums/en-US/ad854e28-02f5-451b-9000-c8bcb1355d0b/codefirst-ctp5-und-default-values?forum=adonetefx

9
NinjaNye

Eine andere Option hier ist, die Standardklasse SqlServerMigrationSqlGenerator mit Ihrer eigenen zu überschreiben. Sie können dann bestimmte Dinge, die Sie in der Generate-Methode ausführen möchten, einfügen (z. B. Standardwerte). Das Schöne daran ist, dass Sie dies auch in anderen Anwendungen verwenden können, da es ziemlich generisch ist. Hier ist eine gute Erklärung dazu.

 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

Da EF nicht die Funktionen hat, die ich brauche, wie Standardwerte und eindeutige Schlüssel als Fremdschlüssel, müssen wir den ORM von EF in NHibernate ändern. Es scheint mir, dass NHibernate mehr Funktionen als EF 6.X hat. 

1
Tony Bao

Siehe Beispiel unten

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