2011-10-10 16 views
6

Tengo una pregunta de diseño relacionada con las entidades de Entity Framework.Entity Framework Design - Múltiples "Vistas" para los datos

He creado la siguiente entidad:

public class SomeEntity { 
    // full review details here 
} 

Esta entidad tiene como ejemplo 30 columnas. Cuando necesito crear una nueva entidad, esto funciona muy bien. Tengo todos los campos requeridos para insertar en la base de datos.

Tengo algunos lugares en mi aplicación donde necesito mostrar algunos datos tabulares con algunos de los campos de SomeEntity, pero no necesito las 30 columnas, tal vez solo 2 o 3 columnas.

puedo crear una entidad totalmente nueva que tiene sólo los campos que necesito (que corresponde a la misma mesa que SomeEntity, pero sólo recupera la columna que quiero?)

O ¿tiene más sentido para crear una la clase de dominio (como PartialEntity) y escribir una consulta como esta:

var partialObjects = from e in db.SomeEntities 
        select new PartialEntity { Column1 = e.Column1, Column2 = e.Column2 }; 

no estoy seguro de cuál es la forma adecuada de hacer este tipo de cosas. ¿Es una mala idea tener dos entidades que se asocien a la misma tabla/columnas? En realidad, nunca necesitaría la capacidad de crear una entidad parcial y guardarla en la base de datos, porque no tendría todos los campos necesarios.

Respuesta

2

Su primer acercamiento no es posible. EF no admite múltiples entidades mapeadas en la misma tabla (excepto en algunos casos especiales, como la herencia de TPH o la división de tablas).

El segundo caso es un escenario común. Creará un modelo de vista para su UI y proyectará su entidad para ver el modelo directamente en la consulta (pasará de las columnas solo DB que proyecte) o consultará toda la entidad y hará la conversión para ver el modelo en su código de aplicación (por ejemplo, AutoMapper como se menciona @Fernando).

Si está utilizando un archivo EDMX para el mapeo (supongo que no porque mencionó ) puede utilizar el tercer enfoque que toma parte de ambos enfoques mencionados. Ese enfoque define QueryView - es una vista basada en EF en la entidad mapeada que se comporta como una nueva entidad de solo lectura. En general, es una proyección reutilizable almacenada directamente en el mapeo.

+0

¿Qué pasa con mi segundo enfoque? ¿Es eso válido simplemente crear un POCO y escribir una consulta que devolverá ese objeto al consultar mis entidades reales? – Dismissile

1

Puede crear un método de filtro de propiedades genérico que tome una instancia de objeto, y pase una matriz de cadenas de nombres de columna, y este método devolverá un objeto dinámico con solo las columnas que desee.

1

Creo que agregaría una complejidad innecesaria a su modelo para agregar una segunda entidad basada en la misma estructura de datos. Honestamente, no veo el problema de tener una sola entidad para actualizar \ editing \ viewing. Si insiste en separar el acceso a SomeEntity, podría tener una vista de base de datos: es decir, SomeEntityView, y crear una entidad separada basada en que.

2

Lo que ha propuesto como primera solución es el "paradigma de modelo de vista", donde crea una clase con el único propósito de ser el modelo de una vista para recuperar datos y luego asignarla a la clase de modelo. Puede usar AutoMapper para mapear los valores. Aquí hay un article sobre cómo aplicar esto.

+0

Estamos utilizando AutoMapper para crear modelos de vista. Este escenario es ligeramente diferente porque no quiero la ineficacia de seleccionar la entidad completa. Si recuperé 1000 filas con esta consulta: var data = from a in db.MainEntity selecciona a; y luego apliqué el mapeo a mi tipo más pequeño, estoy bastante seguro de que EF no haría una consulta más inteligente. Es por eso que estaba preguntando si debería crear una entidad más pequeña o escribir la consulta para hacer el "mapeo" yo mismo. – Dismissile

Cuestiones relacionadas