none
contexto acotado EF RRS feed

  • Pregunta

  • Hola

    Trabajo con Windows Forms, EF, Code First, SQL Server 2014

    Tengo la necesidad de crear multiples contextos, tengo el siguiente código

    public class BusinessContext : DbContext
        {
    
            public BusinessContext() : base("Business")
            {
                Configuration.LazyLoadingEnabled = false;
                Configuration.ProxyCreationEnabled = false;
            }
            public DbSet<Cliente> Clientes { get; set; }
            public DbSet<Comprobante> Comprobantes { get; set; }
            public DbSet<FormaPago> FormaPagos { get; set; }
            public DbSet<ComprobantePago> ComprobantePagos { get; set; }
            public DbSet<Numerador> Numeradores { get; set; }
            public DbSet<Proveedor> Proveedores { get; set; }
            public DbSet<DetalleComprobantePago> DetalleComprobantePagos { get; set; }
            public DbSet<Usuario> Usuarios { get; set; }
            public DbSet<OrdenVenta> OrdenVentas { get; set; }
            public DbSet<DetalleOrdenVenta> DetalleOrdenVentas { get; set; }
            public DbSet<ImpuestoVenta> ImpuestoVentas { get; set; }
            public DbSet<EstadoComprobanteElectronico> EstadoComprobanteElectronicos { get; set; }
            public DbSet<NumeradorOrdenVenta> NumeradorOrdenVentas { get; set; }
            public DbSet<MovimientoCaja> MovimientoCajas { get; set; }
            public DbSet<Rol> Roles { get; set; }
            public DbSet<Funcion> Funciones { get; set; }
            public DbSet<Ventana> Ventanas { get; set; }
            public DbSet<ControlAcceso> ControlAccesos { get; set; }
            public DbSet<Operacion> Operaciones { get; set; }
            public DbSet<Denominacion> Denominaciones { get; set; }
            public DbSet<Recuento> Recuentos { get; set; }
    
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new ClienteMap());
                modelBuilder.Configurations.Add(new ComprobanteMap());
                modelBuilder.Configurations.Add(new FormaPagoMap());
                modelBuilder.Configurations.Add(new ComprobantePagoMap());
                modelBuilder.Configurations.Add(new NumeradorMap());
                modelBuilder.Configurations.Add(new ProveedorMap());
                modelBuilder.Configurations.Add(new DetalleComprobantePagoMap());
                modelBuilder.Configurations.Add(new UsuarioMap());
                modelBuilder.Configurations.Add(new OrdenVentaMap());
                modelBuilder.Configurations.Add(new DetalleOrdenVentaMap());
                modelBuilder.Configurations.Add(new ImpuestoVentaMap());
                modelBuilder.Configurations.Add(new RolMap());
                modelBuilder.Configurations.Add(new FuncionMap());
                modelBuilder.Configurations.Add(new VentanaMap());
                modelBuilder.Configurations.Add(new ControlAccesoMap());
                modelBuilder.Configurations.Add(new EstadoComprobanteElectronicoMap());
                modelBuilder.Configurations.Add(new NumeradorOrdenVentaMap());
                modelBuilder.Configurations.Add(new MovimientoCajaMap());
                modelBuilder.Configurations.Add(new OperacionMap());
                modelBuilder.Configurations.Add(new DenominacionMap());
                modelBuilder.Configurations.Add(new RecuentoMap());
                base.OnModelCreating(modelBuilder);
            }
        }
    
        public class MantenimientoContext : DbContext
        {
            public MantenimientoContext() : base("name=MantenimientoContext")
            {
    
            }
            public DbSet<Empresa> Empresas { get; set; }
            public DbSet<Establecimiento> Establecimientos { get; set; }
            public DbSet<PuntoEmision> PuntoEmisiones { get; set; }
            public DbSet<TipoIdentificacion> TipoIdentificaciones { get; set; }
            public DbSet<Impuesto> Impuestos { get; set; }
            public DbSet<TasaImpuesto> TasaImpuestos { get; set; }
            public DbSet<Producto> Productos { get; set; }
            public DbSet<Moneda> Monedas { get; set; }
            public DbSet<Laboratorio> Laboratorios { get; set; }
            public DbSet<Marca> Marcas { get; set; }
            public DbSet<Categoria> Categorias { get; set; }
            public DbSet<SubCategoria> SubCategorias { get; set; }
            public DbSet<Presentacion> Presentaciones { get; set; }
            public DbSet<Colour> Colores { get; set; }
            public DbSet<Talla> Tallas { get; set; }
            public DbSet<ListaPrecio> ListaPrecios { get; set; }
            public DbSet<ProductoPrecio> ProductoPrecios { get; set; }
            public DbSet<HistoricoProductoPrecio> HistoricoProductoPrecios { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new EmpresaMap());
                modelBuilder.Configurations.Add(new EstablecimientoMap());
                modelBuilder.Configurations.Add(new PuntoEmisionMap());
                modelBuilder.Configurations.Add(new TipoIdentificacionMap());
                modelBuilder.Configurations.Add(new ImpuestoMap());
                modelBuilder.Configurations.Add(new TasaImpuestoMap());
                modelBuilder.Configurations.Add(new ProductoMap());
                modelBuilder.Configurations.Add(new MonedaMap());
                modelBuilder.Configurations.Add(new LaboratorioMap());
                modelBuilder.Configurations.Add(new MarcaMap());
                modelBuilder.Configurations.Add(new CategoriaMap());
                modelBuilder.Configurations.Add(new SubCategoriaMap());
                modelBuilder.Configurations.Add(new PresentacionMap());
                modelBuilder.Configurations.Add(new ColorMap());
                modelBuilder.Configurations.Add(new TallaMap());
                modelBuilder.Configurations.Add(new ListaPrecioMap());
                modelBuilder.Configurations.Add(new ProductoPrecioMap());
                modelBuilder.Configurations.Add(new HistoricoProductoPrecioMap());
                modelBuilder.HasDefaultSchema("Mantenimiento");
            }
        }

    ¿Cual es la manera correcta de crear multiples contextos, dentro de una misma base de datos?

    Saludos!

     

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    martes, 7 de enero de 2020 22:59

Respuestas

  • hola

    >>¿Cual es la manera correcta de crear multiples contextos, dentro de una misma base de datos?

    no hay una manera "correcta" porque depende del negocio y como generes los bounded context

    Pero deberias determinar que entidades se agrupan naturalmente y cuales requiere de otras solo algun dato de solo lectura, no se imaginesmos el contexto de Facturacion, en este la entidad de cliente y sus datos de contacto y direccion solo seran de lectura, en ese contexto podrias definir un entidad Cliente que sera diferente a la entidad cliente de contexto de seguridad o del contexto de CRM, etc

    en el contexto de factura podrias definir la entidad cliente con solo las propiedades que necesitara la facturacion y solo eso para que al realizar un query de linq que solo realice SELECT sobre el cliente, si necesitas modificar algo del cliente no lo haras con ese contexto de factura sino que usaras el que corresponda

    La idea es ver que entidades se agrupan funcionalmente, y defiens diferentes dbcontext que apunten a la misma db en el connection string

    Si puedes seria bueno definir "schemas" diferenciados para cada contexto de EF

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 7 de enero de 2020 23:21

Todas las respuestas

  • hola

    >>¿Cual es la manera correcta de crear multiples contextos, dentro de una misma base de datos?

    no hay una manera "correcta" porque depende del negocio y como generes los bounded context

    Pero deberias determinar que entidades se agrupan naturalmente y cuales requiere de otras solo algun dato de solo lectura, no se imaginesmos el contexto de Facturacion, en este la entidad de cliente y sus datos de contacto y direccion solo seran de lectura, en ese contexto podrias definir un entidad Cliente que sera diferente a la entidad cliente de contexto de seguridad o del contexto de CRM, etc

    en el contexto de factura podrias definir la entidad cliente con solo las propiedades que necesitara la facturacion y solo eso para que al realizar un query de linq que solo realice SELECT sobre el cliente, si necesitas modificar algo del cliente no lo haras con ese contexto de factura sino que usaras el que corresponda

    La idea es ver que entidades se agrupan funcionalmente, y defiens diferentes dbcontext que apunten a la misma db en el connection string

    Si puedes seria bueno definir "schemas" diferenciados para cada contexto de EF

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 7 de enero de 2020 23:21
  • Hola @Leandro

    He pensado crear por ahora los siguientes shemas

    Mantenimiento:

    • Empresas
    • Establecimientos
    • PuntoEmisiones
    • Impuestos
    • TasaImpuestos
    • Productos
    • Monedas
    • Laboratorios
    • Marcas
    • Categorias
    • SubCategorias
    • Presentaciones
    • Colores
    • Tallas
    • ListaPrecios
    • ProductoPrecios
    • HistoricoProductoPrecios

    Ventas:

    • Comprobantes
    • FormaPagos
    • ComprobantePagos
    • DetalleComprobantePagos
    • OrdenVentas
    • DetalleOrdenVentas
    • ImpuestoVentas
    • NumeradorOrdenVentas

    Tesorería:

    Inventario:

    Ventas va a necesitar de productos, se podría crear una tabla que sea una lista de productos? ó una ViewListaProductos?

    Sobre lo de Cliente había pensado dejarlo en el shema Venta


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    miércoles, 8 de enero de 2020 0:45
  • Hola @Leandro

    La idea es ver que entidades se agrupan funcionalmente, y defiens diferentes dbcontext que apunten a la misma db en el connection string
    Si puedes seria bueno definir "schemas" diferenciados para cada contexto de EF

    Logre segmentar el contexto(db) en varios shemas

    Había que hacer un truco que es la nueva funcionalidad de EF 6, "Los contexts estén en diferentes carpetas, para lo cual podemos aprovecharnos del flag MigrationsDirectory."

    Me puedes facilitar un manual para implementar Anticorruption Layer, para ir estudiandolo.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    miércoles, 8 de enero de 2020 6:07