Entity Framework 7 Establecer precisión decimal para el constructor de modelos

entity-framework-core

Pregunta

He estado tratando de averiguar cómo configurar la precisión decimal para EF7 (Beta 4) sin suerte.

Esperaba hacer algo como:

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

Esto no parece estar disponible, pero pude encontrar la siguiente clase en el repositorio en GitHub:

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

No hay ejemplos de cómo usar las clases RelationalTypeMapping o las firmas de métodos con ellos. ¿Quizás esto solo se usa como parte de la API de mapeo para recuperar información?

Otro lugar donde podría esperar que sea este es el siguiente:

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

o

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

Esto solo requiere una cadena, ¿esta funcionalidad aún no está implementada o simplemente no estoy buscando en el lugar correcto?

Edición: Me di cuenta de que la cadena es probablemente para el tipo de solución .ColumnType ("decimal (10,6)") hasta que se desarrolle aún más, pero no me importaría obtener una aclaración, ya que preferiría no usar cadenas para esto.

Edición: después de la aclaración de Bricelam, terminé creando la siguiente extensión para usar por ahora para evitar el uso de la cuerda, y aprecio la simplicidad de su enfoque:

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

Ejemplo de uso:

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

Edit: Haciendo modificación para RC1

Todavía no he probado esto, pero acabo de juntar las siguientes 2 muestras de lo que probablemente se verá con RC1

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

Como todavía no lo he probado, no estoy seguro de cuál sería el uso correcto entre "HasColumnType" o "ForSqlServerHasColumnType", pero espero que esto apunte a alguien en la dirección correcta.

Respuesta aceptada

Su solución es el diseño que pretendemos. En lugar de tener un montón de "facetas", puede establecer un tipo como precisión, escala, longitud máxima, Unicode / ansi, longitud fija / variable, etc. Decidimos mantenerlo simple: si la asignación de tipos predeterminada no es lo que Si quieres, dinos que tipo de uso. Se ha hablado de volver sobre esta decisión y reintroducir las "facetas". Si te parece bien, te animo a crear un nuevo problema .

También tenga en cuenta que hay un montón de otros errores en el mapeo de tipo en este momento, pero deberían solucionarse en el momento en que lanzemos la versión beta5.


Respuesta popular

El ejemplo que se muestra parece estar desactualizado según EF RC1.

Así es como configuro la precisión en un campo decimal.

Di que tengo una entidad

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; }
}

luego, en mi clase de contexto, sobre la creación de modelos, hago una instancia de la asignación (podría hacer la asignación allí, pero me gusta mantenerla separada)

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..
    }
}

y luego el mapeo. Recuerde usar el espacio de nombres donde están las extensiones de modelo:

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



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué