2015-05-22 14 views
7

Ich habe versucht, herauszufinden, wie die Dezimalgenauigkeit für EF7 (Beta 4) ohne Glück einzustellen.Entity Framework 7 Dezimalgenauigkeit für Modell Builder

Ich habe erwartet, wie etwas zu tun:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).Precision(10, 6) 

Das ist nicht verfügbar zu sein scheint, aber ich war in der Lage die folgende Klasse im Repository in GitHub zu finden:

https://github.com/aspnet/EntityFramework/blob/7.0.0-beta4/src/EntityFramework.Relational/RelationalDecimalTypeMapping.cs

Es gibt keine Beispiele für die Verwendung der RelationalTypeMapping-Klassen oder Methodensignaturen mit ihnen. Vielleicht wird dies nur als Teil der Mapping-API zum Abrufen von Informationen verwendet?

Ein weiterer Ort, den ich dies erwarten könnte zu sein, ist die folgende:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().ColumnType() 

oder

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForSqlServer().ColumnType() 

Diese nur einen String, ist diese Funktionalität nur noch nicht implementiert oder bin ich gerade nicht auf der Suche an der richtigen Stelle?

Edit: Gerade festgestellt, dass Zeichenfolge ist wahrscheinlich für .ColumnType ("Dezimal (10,6)") Art der Lösung, bis dies weiter ausgebaut ist, würde immer noch etwas Klärung, obwohl ich lieber würde nicht für diese Strings zu verwenden

Edit: nach Klärung von bricelam endete ich die folgende Erweiterung der Erstellung bis jetzt zu verwenden, um die Zeichenfolge zu vermeiden, verwenden, und ich schätze die Einfachheit ihres Ansatzes:

public static RelationalPropertyBuilder DecimalPrecision(this RelationalPropertyBuilder propertyBuilder, int precision, int scale) 
    { 
     return propertyBuilder.ColumnType($"decimal({precision},{scale})"); 
    } 

Anwendungsbeispiel:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().DecimalPrecision(10,6); 

Edit: machen Modifikation für RC1

Ich habe diese noch nicht getestet, aber ich warf nur zusammen die folgenden zwei Proben von dem, was diese wahrscheinlich mit RC1 aussehen

public static PropertyBuilder DecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale) 
    { 
     return propertyBuilder.HasColumnType($"decimal({precision},{scale})"); 
    } 

    public static PropertyBuilder SqlDecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale) 
    { 
     return propertyBuilder.ForSqlServerHasColumnType($"decimal({precision},{scale})"); 
    } 

Da ich dies noch nicht ausprobiert habe, bin ich nicht sicher, welche die richtige Verwendung zwischen "HasColumnType" oder "ForSqlServerHasColumnType" wäre, aber hoffentlich wird dies jemanden in die richtige Richtung weisen.

+0

Da alle meine Dezimal-Eigenschaften die gleiche Genauigkeit haben, können Sie diese auf allen in einer Zeile implementieren? Ich benutzte dies mit EF6: 'modelBuilder.Properties () .Konfigurieren (x => x.HasPrecision (18, 6));' – GregoryHouseMD

+0

@reala valoro, ich habe die Details aktualisiert, um RC1 Änderungen widerzuspiegeln –

Antwort

4

Ihre Problemumgehung ist das von uns beabsichtigte Design. Anstatt eine Reihe von "Facetten" zu haben, können Sie einen Typ wie Präzision, Skalierung, maximale Länge, Unicode/ansi, feste/variable Länge usw. einstellen. Wir haben uns entschieden, es einfach zu halten: Wenn das Standard-Mapping nicht was ist Sie wollen, sagen Sie uns, welchen Typ Sie verwenden sollen. Es gab Gespräche darüber, auf diese Entscheidung zurückzukommen und die "Facetten" wieder einzuführen. Wenn Sie sich darüber stark fühlen, würde ich Sie ermutigen, create a new issue.

Beachten Sie auch, dass es in der Typzuordnung gerade eine Menge anderer Bugs gibt, die aber bis zur Veröffentlichung von beta5 behoben sein sollten.

+0

Vielen Dank für Zur Klärung habe ich die Frage mit einer einfachen Erweiterung bearbeitet, die ich erstellt habe, um die Zeichenfolge zu vermeiden. Ich wäre nicht überrascht von all dem, dass diese auf der Straße wieder eingeführt werden, aber ich würde nicht denken, dass dies ein Problem verursacht, da ihr Jungs viel größere Fische zum Fressen hat :) Ich schätze all die Arbeit, die ihr tut Freue mich schon sehr auf EF7 mehr! –

1

Das gezeigte Beispiel scheint nach EF RC1 veraltet zu sein.

Hier ist, wie ich Präzision auf ein Dezimalfeld einstellen.

sagen, dass ich ein Unternehmen

public class Review 
{ 
    public int ReviewId { get; set; } 
    public decimal TotalScore { get; set; } //I want a precision field in DB 
    public DateTime CreatedOn { get; set; } 
    [Timestamp] 
    public byte[] RowVersion { get; set; } 
} 

dann in meiner Kontextklasse, auf Modell habe, instanziieren ich das Mapping (ich konnte dort die Zuordnung tun, aber Ich mag es getrennt halten)

public class MyDbContext : DbContext 
{ 
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) 
    { 
    } 

    public DbSet<Review> Reviews { get; set; } 
    //etc. 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     //Mappings 
     new ReviewMap(modelBuilder.Entity<Review>()); 
     //etc.. 
    } 
} 

und dann das Mapping. Denken Sie daran, den Namespace zu verwenden, in dem sich die Modellerweiterungen befinden:

using Microsoft.Data.Entity; //here is where the extensions are 
public class ReviewMap 
{ 
    public ReviewMap(EntityTypeBuilder<Review> entityBuilder) 
    { 
     entityBuilder.HasKey(r => r.ReviewId); 

     //Using the column type extension 
     entityBuilder.Property(r => r.TotalScore) 
      .HasColumnType($"decimal(5,2)") 
      .IsRequired(true); 

     //and this has nothing to do with the example but it's interesting 
     //to show how to use Sql command to automatically fulfil a value 
     //when adding a new Entity 
     entityBuilder.Property(r => r.CreatedOn) 
      .ValueGeneratedOnAdd() 
      .HasDefaultValueSql("GETUTCDATE()") 
      .IsRequired(true); 
    } 
} 
Verwandte Themen