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
 

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

Preguntas similares