Saltar al contenido

Establecer decimal (16, 3) para una columna en Code First Approach en EF4.3

Nuestro team especializado despúes de varios días de investigación y recopilación de de información, han obtenido los datos necesarios, queremos que te resulte útil para tu trabajo.

Solución:

los DataType El atributo es un atributo de validación. Necesitas hacer eso usando el ModelBuilder.

public class MyContext : DbContext

    public DbSet MyClass;
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.Entity().Property(x => x.SnachCount).HasPrecision(16, 3);
        modelBuilder.Entity().Property(x => x.MinimumStock).HasPrecision(16, 3);
        modelBuilder.Entity().Property(x => x.MaximumStock).HasPrecision(16, 3);
    

Puede modificar todas las propiedades decimales en la base de datos. En su DBContext en el método OnModelCreating, agregue la línea:

modelBuilder.Properties().Configure(c => c.HasPrecision(18, 3));

Esto se copia de la respuesta que publiqué a la misma pregunta aquí; https://stackoverflow.com/a/15386883/1186032.


Pasé un buen rato creando un atributo personalizado para esto:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public sealed class DecimalPrecisionAttribute : Attribute

    public DecimalPrecisionAttribute(byte precision, byte scale)
    
        Precision = precision;
        Scale = scale;

    

    public byte Precision  get; set; 
    public byte Scale  get; set; 


usándolo así

[DecimalPrecision(20,10)]
public Nullable DeliveryPrice  get; set; 

y la magia sucede en la creación del modelo con algo de reflexión

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)

    foreach (Type classType in from t in Assembly.GetAssembly(typeof(DecimalPrecisionAttribute)).GetTypes()
                                   where t.IsClass && t.Namespace == "YOURMODELNAMESPACE"
                                   select t)
     
         foreach (var propAttr in classType.GetProperties(BindingFlags.Public 

la primera parte es obtener todas las clases en el modelo (mi costumbre attribute se define en ese ensamblaje, así que lo usé para obtener el ensamblaje con el modelo)

el segundo foreach obtiene todas las propiedades en esa clase con la costumbre attributey el attribute en sí mismo para que pueda obtener los datos de precisión y escala

después de eso tengo que llamar

modelBuilder.Entity().Property(c=> c.PROPERTY_NAME).HasPrecision(PRECITION,SCALE);

así que llamo al modelBuilder.Entity() por reflexión y lo almaceno en la variable entityConfig, luego construyo la expresión lambda “c => c.PROPERTY_NAME”

Después de eso, si el decimal es anulable, llamo al

Property(Expression> propertyExpression) 

método (lo llamo por la posición en el arrayno es ideal, lo sé, cualquier ayuda será muy apreciada)

y si no es anulable, llamo al

Property(Expression> propertyExpression)

método.

Teniendo DecimalPropertyConfiguration, llamo al método HasPrecision.

Más adelante puedes encontrar las interpretaciones de otros desarrolladores, tú aún eres capaz mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *