Précision décimale et échelle dans EF Code First

.net c# decimal ef-code-first entity-framework

Question

J'expérimente avec cette approche code d'abord, mais je découvre maintenant qu'une propriété de type System.Decimal est mappée sur une colonne SQL de type decimal (18, 0).

Comment définir la précision de la colonne de la base de données?

Réponse acceptée

La réponse de Dave Van den Eynde est maintenant obsolète. Il y a deux modifications importantes. À partir de la version EF 4.1, la classe ModelBuilder s'appelle désormais DbModelBuilder et la méthode DecimalPropertyConfiguration.HasPrecision possède la signature suivante:

public DecimalPropertyConfiguration HasPrecision(
byte precision,
byte scale )

où précision correspond au nombre total de chiffres que la base de données stockera, quel que soit le point de la virgule et où scale correspond au nombre de décimales à stocker.

Par conséquent, il n’est pas nécessaire de parcourir les propriétés comme indiqué, mais on peut simplement les appeler à partir de

public class EFDbContext : DbContext
{
   protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
   {
       modelBuilder.Entity<Class>().Property(object => object.property).HasPrecision(12, 10);

       base.OnModelCreating(modelBuilder);
   }
}

Réponse populaire

Si vous souhaitez définir la précision de toutes les decimals dans EF6, vous pouvez remplacer la convention DecimalPropertyConvention par défaut utilisée dans DbModelBuilder :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
    modelBuilder.Conventions.Add(new DecimalPropertyConvention(38, 18));
}

La valeur par défaut DecimalPropertyConvention dans EF6 mappe decimal propriétés decimal(18,2) sur decimal(18,2) colonnes decimal(18,2) .

Si vous souhaitez uniquement que les propriétés individuelles aient une précision spécifiée, vous pouvez définir la précision de la propriété de l'entité sur DbModelBuilder :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyEntity>().Property(e => e.Value).HasPrecision(38, 18);
}

Ou bien, ajoutez EntityTypeConfiguration<> pour l'entité qui spécifie la précision:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new MyEntityConfiguration());
}

internal class MyEntityConfiguration : EntityTypeConfiguration<MyEntity>
{
    internal MyEntityConfiguration()
    {
        this.Property(e => e.Value).HasPrecision(38, 18);
    }
}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow