es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice Entity Framework 6 para crear una columna NUMBER en Oracle db 19 sin precisión ni escala.

Estoy utilizando EntityFramework 6.4.4 en modo code first para crear una base de datos. Mi servidor de base de datos es Oracle 19C. Uno de los campos de mi base de datos es un campo de moneda (decimal) y este campo, llamémoslo Precio, se multiplicará principalmente por valores decimales grandes, pero también a veces por valores pequeños, por lo que necesito que la precisión y la escala sean flexibles para acomodar todos los tamaños de valores.

En el sistema antiguo, el campo tenía el tipo de datos NUMBER, pero eso se configuró directamente con PLSQL, ahora sin importar lo que intente usando EF6 (C#), sigo obteniendo Number(18,2).

Busqué en línea y encontré en este artículo (https://www.devart.com/dotconnect/oracle/docs/datatypemapping.html) que estas son las convenciones decimales de C#, y que puedo desactivarlas (https://learn.microsoft.com/en-us/dotnet/api/system.data.entity.modelconfiguration.conventions.decimalpropertyconvention?redirectedfrom=MSDN&>

Entonces, en mi código, lo desactivé en el AppDbContext de esta manera:

using TestDB.Model;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace TestDB
{
    public class MyDbModel : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<decimalpropertyconvention>();
            .
            .
        }

Pero el resultado que obtengo ahora es NUMBER(38,0), que es el valor predeterminado de Oracle.

¿Qué debo hacer para establecer el tipo de datos de un campo como NUMBER sin precisión y escala?
¿O no es compatible con EF6?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que EntityFramework 6 tiene sus propias convenciones para mapear los tipos de datos de C# a los tipos de datos de Oracle, lo cual está causando el problema con la precisión y escala de su campo de moneda. Al eliminar la DecimalPropertyConvention, ha deshabilitado la convención predeterminada de EF6 para mapear propiedades decimales a Number(18,2), pero aún así no le proporciona el tipo de datos NUMBER deseado sin precisión y escala.

    Para establecer el tipo de datos de un campo como NUMBER sin precisión y escala en EF6, puede intentar usar el método HasColumnType en su método OnModelCreating de la siguiente manera:

    modelBuilder.Entity<suentidad>()
        .Property(e => e.Precio)
        .HasColumnType("NUMBER");
    

    Esto debería establecer el tipo de datos de la propiedad Precio como NUMBER sin especificar ninguna precisión o escala.

    Sin embargo, tenga en cuenta que esto puede causar problemas de rendimiento o precisión de datos en la base de datos si no tiene cuidado con cómo maneja los datos en su aplicación. Generalmente se recomienda usar una precisión y escala específicas para campos decimales para garantizar un almacenamiento y cálculos de datos consistentes y precisos.

Comments are closed.