2009-04-10 27 views
32

Tengo una base de datos desde la que deseo construir un modelo EF, sin embargo, no quiero incluir ciertas columnas de la base de datos ya que las columnas afectadas se mantienen exclusivamente en el servidor y no deben ser manipuladas por cualquier aplicaciónEntity Framework: Ignorar columnas

Ambas columnas son DateTime (si hay alguna diferencia), una de las columnas es anulable y se mantiene mediante un desencadenador de actualizaciones y la otra no se puede nulos y se establece con un valor predeterminado en la definición de tabla.

Supongo que estoy buscando algo así como la opción "Servidor generado" en Linq2Sql; pero no puedo encontrar tal opción.

¿Alguien me puede decir cómo solucionar esto?

Advertencia:

He estado tratando de introducir el modelado de objetos de negocio en mi lugar de trabajo durante algunos años y siempre ha sido rechazada debido a la cantidad de código adicional que tiene que ser operado manualmente. En la actualidad, se ve a EF como una solución viable debido a la generación del diseñador y el código, por lo que cualquier opción que implique el arranque manual del XML solo alejará al resto de mis colegas de EF. Por lo tanto, estoy buscando algo que pueda hacerse ya sea usando el diseñador o usando el código.

EDIT:

supongo que lo que estoy buscando aquí es bien ...

(a) una manera de crear el modelo sin EF referencia a las columnas en la tienda (ssdl) y por lo tanto, no intentar manipularlo de ninguna manera (b) una forma de establecer programáticamente el atributo "StoreGeneratedPattern" contra la propiedad cuando creo ObjectContext (la respuesta fácil es manipular manualmente esto en .ssdl, pero esto sería entonces se sobrescriba si actualicé el modelo de la base de datos y no puedo ir por la ruta donde el .csdl, .msl & .ssdl son manuales).

Respuesta

1

¿No desea que la columna aparezca en el modelo?

Intente seleccionar la columna en la vista del Diseñador y presionar la tecla Eliminar.

Editar

Usted podría hacer que el definidor de la propiedad privada. Entonces tu aplicación no podrá modificar el valor.

+3

Desafortunadamente, si pruebo esto, entonces obtengo errores en el modelo ya que la columna no está mapeada. –

+0

¿Qué tipo de errores? – TGnat

+0

Error 3023: problema en el fragmento de asignación que comienza en la línea 197: Column TableName.ColumnName en la tabla TableName debe correlacionarse: no tiene valor predeterminado y no puede contener nulos. –

2

¿No puede crear una vista con las columnas que necesita e importarla a través del asistente de función de entidad y asignarla a sus entidades?

+2

Gracias, esta podría ser una solución, aunque preferiría evitar tener que crear una vista para cada tabla si puedo - las columnas que he descrito en mi original problema realmente aparece en cada tabla en la base de datos. –

0

Haga clic derecho en el campo en la representación gráfica y elija eliminar. He descubierto que a veces obtendrá errores cuando realiza muchos cambios en el modelado de una vez y comienza a perder la pista de sus cambios. Su mejor opción podría ser reconstruir el modelo generado por EF.

Tenga en cuenta que cuando "actualiza desde la base de datos", los campos antiguos en los modelos generados no se eliminarán, tendrá que eliminarlos manualmente. Por ejemplo, si cambió el nombre de DateField1 a DateField2 en su base de datos, y luego "Update Model from Database", ahora verá tanto DateField1 como DateField2 en el modelo resultante. Esto puede ser una causa de errores.

+0

Esto funciona en la columna que puede contener nulos, pero no funciona para la columna que no admite nulos, produciendo el mismo error que la opción anterior de TGnat. –

+0

Error 3023: Problema en el Fragmento de asignación que comienza en la línea 197: Column TableName.ColumnName en la tabla TableName debe correlacionarse: No tiene valor predeterminado y no puede contener nulos. –

+0

Te tengo ... Creo que puedes estar atascado. Nota interesante, aunque ... tengo una columna rowversion (timestamp) en una de mis tablas db, y el generador EF establece correctamente el atributo StoreGeneratedPattern:

28

¿Se puede hacer esto con Entity Framework? Sí; es fácil.¿Puedes hacer esto con el diseñador de Entity Framework? Desafortunadamente, eso es mucho más difícil.

El problema que tiene es que la columna existe en el esquema de almacenamiento (SSDL) en su EDMX. La eliminación de la columna con el diseñador de la GUI simplemente la elimina del esquema del cliente, no de la asignación o el esquema de almacenamiento. Sin embargo, es bastante simple entrar en el EDMX y eliminarlo. Una vez hecho esto, también puede eliminarlo de la asignación en las porciones de esquema de cliente del EDMX, y el marco de entidad se quejará más de que no se haya asignado.

Problema resuelto, ¿no?

Bueno, no. Cuando utiliza el diseñador de GUI para actualizar el EDMX de la base de datos, el esquema de almacenamiento se descarta y se vuelve a generar. Entonces tu columna regresará. Hasta donde yo sé, no hay forma de decirle al diseñador de la GUI que nunca meta una columna en particular. Por lo tanto, tendrá que volver a hacer esto cada vez que actualice con el diseñador de GUI. Afortunadamente, el EDMX es XML, por lo que puede hacer esto con una transformación XML, LINQ o la herramienta XML de su elección.

+1

Gracias, me di cuenta de que podía hacer esto editando el XML, solo esperaba que hubiera otra forma, como establecer programáticamente el atributo StoreGeneratedPattern al crear el contexto. –

+1

Bueno, la respuesta es la misma (para StoreGeneratedPattern). Puede configurar StoreGeneratedPattern en el XML y funcionará bien, pero el diseñador de la GUI se desvanecerá cuando actualice.Entity Framework tiene características que el diseñador de GUI aún no admite por completo. –

+0

La única otra opción es intentar cambiar los metadatos de la base de datos para que el diseñador de la GUI reconozca lo que desea. Pero no sé cómo el diseñador de GUI genera SSDL en el caso específico de StoreGeneratedPattern. –

0

La marca de tiempo es un tipo de datos diferente que DateTime. Timestamp parece ser reconocido como un atributo que administra el motor, al igual que un atributo de identidad. No puede "actualizar" un atributo de marca de tiempo. Por lo tanto, el EDM puede gestionarlo correctamente (al igual que lo hace con una identidad).

0

Puede modificar la plantilla de texto para ignorar estas columnas al generar sus clases de entidad. Por ejemplo, si agregó "IGNORE" al resumen de la documentación, puede modificar la plantilla para ignorarlos al reemplazar;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity) 

con;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity).Where(Function(p) p.Documentation is nothing orelse p.Documentation.Summary.IndexOf("IGNORE")<0)