Entity framework en capas y un ejemplo completo

19/08/2008 - 11:48 por Asier | Informe spam
Buenos días, llevo bastante tiempo buscando información sobre Entity
framework que me ayude a construir un proyecto separado en capas y no
encuentro lo que busco. A ver si entre todos me pueden ayudar.

El caso es que siguiendo como ejemplo el MSDN Vídeo (que si bien usa
Linq no lo hace con Entity framework) he creado una capa para los CN
(Componentes de negocio) y otra para los AD (acceso a datos). El
archivo de modelo de entidades, el .edmx está en otra capa que se
llama Comun.

Como todos ustedes saben cuando un elemento de la capa de presentación
requiere llamar a los datos como por ejemplo para obtener los usuarios
de la aplicación, desde esta capa llamaremos a la capa de negocio,
que a su vez llamará a la capa de datos. Hasta ahí de acuerdo no?

Vale, entonces desde esa capa de datos, en la clase UsuarioAD ¿tenemos
que crear cada vez una nueva instancia de las entidades? o tenemos que
usar siempre la misma mediante un singleton o algo parecido?

Entidades entidades = new Entidades();

query = from usuario in entidades.Usuarios select usuario;
return QueryToBindingList(query); //llamamos al método que nos
convierte la consulta en una lista de usuarios

La lógica me hace pensar que sólo debe haber una instancia, pero en
ejemplos que he visto por internet como (http://msdn.microsoft.com/es-
es/magazine/cc700340.aspx, bastante bueno por cierto) cada vez que
crea una instancia de una clase AD crea una instancia de las
entidades.

El problema que veo en tener muchas instancias es que cuando intentas
vincular un objeto de una de ellas con otro objeto de otra da error.
Ej.

Tenemos una relación varios a varios (el Entity framework lo soporta),
con Empleados y Proyectos, por un lado sacamos la lista de empleados
(de una instancia del modelo de entidades nueva que nos ha generado el
EmpleadoAD) y por otro lado la lista de proyectos (de otra instancia
del modelo de entidades también nueva que ha generado de un
ProyectoAD.

Si ahora queremos vincular un proyecto a un empleado, da el error:

"No se puede definir la relación entre dos objetos porque están
asociados a objetos ObjectContext diferentes"

¿alguien sabe cuál es la arquitectura correcta?, si quieren podemos
pensar entre todos cuál sería la mejor forma de abordar un proyecto
real separado en capas usando Entity framework.

Gracias por leer semejante tocho. Un saludo

Preguntas similare

Leer las respuestas

#1 Luis S. B.
02/12/2008 - 10:59 | Informe spam
Hola Asier.

Buscando en google te he encontrado...
Yo también ando con lo mismo. He pasado de Linq a Entity Framework
(siguiendo tus pasos). Y busco lo mismo que tú. Al final vamos a tener que
tener una conversación.

Me vas a llegar a odiar.

A ver si hacemos la cena...

"Asier" wrote:

Buenos días, llevo bastante tiempo buscando información sobre Entity
framework que me ayude a construir un proyecto separado en capas y no
encuentro lo que busco. A ver si entre todos me pueden ayudar.

El caso es que siguiendo como ejemplo el MSDN Vídeo (que si bien usa
Linq no lo hace con Entity framework) he creado una capa para los CN
(Componentes de negocio) y otra para los AD (acceso a datos). El
archivo de modelo de entidades, el .edmx está en otra capa que se
llama Comun.

Como todos ustedes saben cuando un elemento de la capa de presentación
requiere llamar a los datos como por ejemplo para obtener los usuarios
de la aplicación, desde esta capa llamaremos a la capa de negocio,
que a su vez llamará a la capa de datos. Hasta ahí de acuerdo no?

Vale, entonces desde esa capa de datos, en la clase UsuarioAD ¿tenemos
que crear cada vez una nueva instancia de las entidades? o tenemos que
usar siempre la misma mediante un singleton o algo parecido?

Entidades entidades = new Entidades();

query = from usuario in entidades.Usuarios select usuario;
return QueryToBindingList(query); //llamamos al método que nos
convierte la consulta en una lista de usuarios

La lógica me hace pensar que sólo debe haber una instancia, pero en
ejemplos que he visto por internet como (http://msdn.microsoft.com/es-
es/magazine/cc700340.aspx, bastante bueno por cierto) cada vez que
crea una instancia de una clase AD crea una instancia de las
entidades.

El problema que veo en tener muchas instancias es que cuando intentas
vincular un objeto de una de ellas con otro objeto de otra da error.
Ej.

Tenemos una relación varios a varios (el Entity framework lo soporta),
con Empleados y Proyectos, por un lado sacamos la lista de empleados
(de una instancia del modelo de entidades nueva que nos ha generado el
EmpleadoAD) y por otro lado la lista de proyectos (de otra instancia
del modelo de entidades también nueva que ha generado de un
ProyectoAD.

Si ahora queremos vincular un proyecto a un empleado, da el error:

"No se puede definir la relación entre dos objetos porque están
asociados a objetos ObjectContext diferentes"

¿alguien sabe cuál es la arquitectura correcta?, si quieren podemos
pensar entre todos cuál sería la mejor forma de abordar un proyecto
real separado en capas usando Entity framework.

Gracias por leer semejante tocho. Un saludo

Respuesta Responder a este mensaje
#2 fescudero
03/12/2008 - 18:21 | Informe spam
> Si ahora queremos vincular un proyecto a un empleado, da el error:

> "No se puede definir la relación entre dos objetos porque están
> asociados a objetos ObjectContext diferentes"




Antes que nada te comento que yo también estoy empezando con EF, asi
que toma mis comentarios como de un novato en el tema.
Con respecto a ese error, a mi también me volvió loco, hasta que
encontré una solución:
Cuando usas un objeto desde un contexto, antes de salir tenes que
hacer un detach del objeto, algo asi como:

nombreContexto.Detach (objeto);

Esto es para que se deshabilite el seguimiento de cambios que realiza
el context.
Y luego cuando vas al otro context, tenés que hacer un attach:

nombreContexto.Atach (objeto);

Y listo.

Espero que te sirva, por lo menos como para orientarte por donde
encararlo.
Por favor si encontrás otra forma de manejarlo comentalo en el foro.

Saludos.

Fabio Escudero
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida