Pregunta Marco de la entidad: Ignorar columnas


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 en cuestión se mantienen exclusivamente en el servidor y no deben ser manipuladas por ninguna aplicación.

Ambas columnas son DateTime (si esto hace alguna diferencia), una de las columnas es anulable y es mantenida por un desencadenante en las actualizaciones y la otra no es anulable y se establece usando un valor predeterminado en la definición de la tabla.

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

¿Alguien puede decirme cómo solucionar esto?

Advertencia:

He estado tratando de introducir modelos de objetos comerciales en mi lugar de trabajo desde hace algunos años y siempre ha sido rechazado debido a la cantidad de código adicional que debe ser manejado a mano. 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.

EDITAR:

Supongo que lo que estoy buscando aquí es ...

(a) una forma de crear el modelo sin EF haciendo referencia a las columnas en la tienda (ssdl) y, por lo tanto, no buscando manipularlo de ninguna manera (b) una forma de establecer programáticamente el atributo "StoreGeneratedPattern" contra la propiedad cuando creo el ObjectContext (la respuesta fácil es manipular manualmente esto en .ssdl, pero esto se sobrescribirá si actualizo el modelo de la base de datos y No puedo seguir la ruta en la que los archivos .csdl, .msl y .ssdl están codificados manualmente).


32
2018-04-10 12:46


origen


Respuestas:


¿Puedes hacer esto con el 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, ¿verdad?

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.


28
2018-04-10 14:28



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


2
2018-04-10 13:13



¿No quieres que la columna aparezca en el modelo?

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

Editar

Podrías hacer que el organismo de la propiedad sea privado. Entonces tu aplicación no podrá modificar el valor.


1
2018-04-10 12:58



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
2018-04-10 13:20



Timestamp 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
2018-04-01 15:46



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)

0
2018-05-14 02:33