Visual CSharp .NET - Relación entre tablas en la capa de negocios.

 
Vista:

Relación entre tablas en la capa de negocios.

Publicado por Jessica (8 intervenciones) el 10/03/2010 17:35:00
Hola.

Tengo tres tabla, una maestra y las otras esclavas.

Cuando muestro los datos en un datagridview de la tabla maestra, realizo un SELECT desde un SP en el cual realizo los INNER JOIN necesarios para obtener el detalle de las tablas esclavas, por ejemplo:

SELECT codigoContacto, nombre,
codigoProfesion, tbProfesion.nombre AS nombreProfesion,
codigoPais, tbPais.nombre AS nombrePais
FROM tbContacto
INNER JOIN tbPais ON tbContacto.codigoPais = tbPais.codigoPais
INNER JOIN tbProfesion ON tbContacto.codigoProfesion = tbProfesion.codigoProfesion

Esto me lleva a crear una entidad de la tabla maestra con todos los demás campos y propiedades de las tablas esclavas, sin embargo me parece que no es lo correcto ya que por algo tambien tengo las entidades de cada una de las tablas esclavas.

Entonces mi duda es como resolver esto para no redundar información en las entidades.

Espero ser clara.

Mi duda es para quienes trabajan en capas.

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Relación entre tablas en la capa de negocios.

Publicado por m (66 intervenciones) el 10/03/2010 22:46:02
Hola.
Pues te falto agregar como estas declarando la clase principal: Supongamos que tienes la clase persona y esta asu vez utiliza a las clases Pais y Profesion.
Entonces si lo que quieres es reutilizar las clases para no redundar info y stored procedures: deja de utilizar los "Joins" y cada store procedure carga su correspondiente tabla.

En lo personal me gusta usar dos carpetas una para declarar las clases base, y otra para servicios [cargar, guardar,actualizar,,,,]. Digo no siempre es la mejor opcion. Espero que alguien mas de su opinion respecto a este tema. Comencemos:

//pseudo codigo.
////////////////Carpeta clases base

//Clase Pais

Public Class Pais
{
public int Codigo{get; set;}//declaracion corta valida a partir de C#3.0
public string Nombre{get; set}
}

Public Class Persona
{
//Propiedades Publicas
Public string ContactoNombre {get; set;};
Public int ContactoCodigo {get;set ;}
.
.
Public int PaisCodigo {get;set}
Public int PaisNombre {get; set;}
}

///fin carpega clases Base

////////////////////////////Carpeta Servicios.
public class PaisSvc
{
public Pais cargaPaisPorCodigo(int codigo)
{
//aqui el codigo para usar el store procedure.
private Pais pais=new Pais;
pais.Nombre= ...["Pais"];
pais.Codigo=codigo;

return pais;
}

public bool insertaPais(int Codigo, string Nombre)
{
//usando un store procedure para insertar un nuevo pais.
.
.
.
return true;// se inserto el pais
}

public List<Paises> cargaTodosLosPaises()
{
List<Paises> paises= new List<Paises>();
//codigo para cargar todos los paises.
return paises
}
}

//PersonaSvc
public class PersonaSvc()
{
public Persona cargaPersonaPorCodigo()
{
private Persona persona= new Persona();

//codigo para cargar la persona usando su correspondiente store procedure.
persona.ConactoNombre=...["Nombre"]


persona.PaisCodigo=...["CodigoPais"] //lo usamos para cargar el pais.
//buscando la info del pais utilizando el servicio del pais
PaisSvc paisSvc=new Pais();
Pais pais =paisSvc.cargaPaisPorCodigo(Persona.PaisCodigo);
persona.PaisNombre=pais.Nombre;
return persona;
}

public List<Personas> cargaTodasLasPersonas()
{
///codigo para cargar todas las personas.

//ahora por cada persona se carga su corresponidente pais
for()
{
personas[i].PaisNombre=paisSvc.cargaPaisPorCodigo(Persona[i].PaisCodigo);.
}

return personas;
}
public void actualizaPersona(Persona persona)
{
//aqui el codigo para actualizar alguna persona
}
}

///////////////////////////Utilizacion de los servicios en la interfaz

PaisSvc paisesSvc=new PaisSvc();
datagridview .DataSource = paisesSvc.CargaTodasLasPersonas();
datagridview .DataBind();

///fin

Saludos y espero haber sido claro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Relación entre tablas en la capa de negocios.

Publicado por m (66 intervenciones) el 11/03/2010 08:32:23
Correccion la en la utilizacion del servicio debio ser de la siguiente manera:
///////////////////////////Utilizacion de los servicios en la interfaz

PersonaSvc personasSvc=new personaSvc();
datagridview .DataSource = personasSvc.CargaTodasLasPersonas();
datagridview .DataBind();

///fin
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Relación entre tablas en la capa de negocios.

Publicado por Jessica (8 intervenciones) el 11/03/2010 21:26:06
Fuerte y claro m.

Me haz dado ideas valiosas y las he puesto en práctica.

Una de las cosas que he querido hacer es utilizar la herencia de esta forma:

Public Class Pais
{
public int PaisCodigo{get; set;}
public string PaisNombre{get; set}
}

Public Class Persona : Pais // Heredando Pais
{
//Propiedades Publicas
Public string ContactoNombre {get; set;};
Public int ContactoCodigo {get;set ;}
.
.
// Y por lo tanto estas propiedades quedarían fuera
//Public int PaisCodigo {get;set}
//Public string PaisNombre {get; set;}

public Persona (int contactoCodigo, string contactoNombre, Pais pais, Profesion profesion)
{
ContactoCodigo = contactoCodigo;
ContactoNombre = contactoNombre;
// Ya no requiero crear propiedades para los sigs. campos pués ya lo estoy
// heredando, sin embargo requiero heredar igualmente la entidad Profesion y
// esto ya no se puede y bueno, empleo lo que me sugieres aún cuando tenga
// que crear sus respectivas propiedades.
PaisCodigo = pais.PaisCodigo;
PaisNombre = pais.PaisNombre;
}

Si tienes alguna idea no dejes de comentarmelo.

Gracias nuevamente.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Relación entre tablas en la capa de negocios.

Publicado por roger (77 intervenciones) el 12/03/2010 22:35:37
hola

no se si entiendo mal o estoy fuera de contexto, pero la relacion de herencia que planteas no es válida. Una persona no puede heredar de pais, ya que la herencia representa relaciones "es un", en ese sentido una persona no es un pais. Creo que se deberia empezar por hacer este planteamiento, antes de continuar con el codigo.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Relación entre tablas en la capa de negocios.

Publicado por Jessica (8 intervenciones) el 12/03/2010 23:29:08
Gracias Roger por tu comentario.

Entiendo lo que me dices, entonces si tengo una clase motor sólo puedo heredar esta clase para realizar una acción sobre ese motor como encenderlo, apagarlo, su marca, su tamaño, su color, etc. y sin embargo no puedo heredar la clase motor para ser utilizada en una clase automovil o motocicleta o avión o barco, etc?

Entonces la herencia multiple se descarta completamente?.

Ahora mi confusión es mayor.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Relación entre tablas en la capa de negocios.

Publicado por roger (77 intervenciones) el 13/03/2010 03:15:37
hay estas hablando de composicion, un automovil esta compuesto por motor, llantas, etc, pero no hay herencia. en el caso que planteas la clase automovil tendria como una de sus propiedades, la clase motor, varias instancias de la clase llanta, etc.
Una clase automovil podria heredar digamos de una clase MedioDeTransporte, donde MedioDeTransporte que es la clase padre tendria caracteristicas comunes a cualquier medio de transporte (caracteristicas son propiedades y metodos). Y mira que tiene sentido la relacion de herencia en este contexto, porque todo automovil ES un medio de transporte, un avion ES un medio de transporte, un barco ES un medio de transporte.

Lo que dices de herencia multiple no aplicaria para este caso. De igual manera C# no soporta herencia multiple y en reemplazo de esto hace uso de interfaces para simular este comportamiento, pero una clase en C# solo puede heredar de una clase base, mas puede implementar muchas interfaces. Pero las interfaces son otro cuento.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Relación entre tablas en la capa de negocios.

Publicado por Jessica (8 intervenciones) el 13/03/2010 17:59:35
Muy bien.

Gracias a ambos, les agradezco.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Relación entre tablas en la capa de negocios.

Publicado por m (66 intervenciones) el 13/03/2010 03:24:09
Pues Roger tiene razon.
Estas tratando de mezclar elementos, por ejemplo un motor no puede ser la clase base
de un automovil, motocicleta o avion, sin embargo un motor es parte de un automovil.
La clase base es una "generalizacion" en este caso la clase base de automovil, motocicleta o avion podria ser vehiculo;dependiendo
del tipo de vehiculo serian las caracteristicas de la clase motor.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar