2010-06-08 14 views
64

Tengo un diseño de modelo de Entity Framework 4 primero. Creo un primer borrador de mi modelo en el diseñador y todo estaba bien. Me compilado, base de datos generada, etc.error de fragmento de asignación de Entity Framework 4 al agregar nueva entidad escalar

Más tarde He intentado añadir un escalar cuerdas (anulable = true) a uno de mis entidades existentes y me siguen dando este tipo de error cuando compilo:

Error 3004: Problema en el mapeo de fragmentos que comienzan en la línea 569: No se ha especificado la asignación para las propiedades MyEntity.MyValue en Set MyEntities. Un Entidad con Clave (PK) no de ida y vuelta cuando: Entidad es de tipo [MyEntities.MyEntity]

guardo tener que abrir manualmente el archivo EDMX y corregir el XML cada vez que agrego escalares.

Ideas sobre lo que está pasando?

+0

¿Qué, exactamente, estás corrigiendo? –

+0

Estaba editando manualmente el tipo de entidad y estableciendo mapeos. –

Respuesta

74

Desde entonces, he descubierto que después de agregar/cambiar/eliminar propiedades en mis entidades debo "Generar una base de datos desde el modelo" antes de compilar, de lo contrario obtengo 3004 errores de mapeo.

+32

¡Esto es ridículo! Estoy creando mi modelo FROM la base de datos, no al revés. Estoy empezando a encontrar EF bastante defectuoso ... :( – Siewers

+5

Me he dado cuenta de que cuando elimino propiedades, la versión actualizada del modelo todavía contiene los campos anteriores. Tengo que eliminar manualmente los campos. Agregar este bit de información en caso de que ayude a alguien. –

+0

Recibo este error, y parece exactamente como si la base de datos no estuviera sincronizada con el modelo. Sin embargo, estoy usando Code First y no puedo "Generar base de datos del modelo".Lo tengo configurado para DropCreateDatabaseIfModelChanges, que por alguna razón no funciona con esta propiedad adicional:/ – elwyn

1

Si todas sus consultas están escritas en procedimientos almacenados y usted simplemente está tratando de completar el modelo, entonces podría cambiar a un tipo complejo que funcionó para mí.

Cómo crear un tipo complejo:

  1. cambiar manualmente el nombre de la clase generada Entidad está que tienen problemas con un nombre no ya en uso en su archivo edmx.
  2. Seleccione la ventana del Explorador de modelos y haga clic con el botón derecho/agregue un nuevo tipo complejo.
  3. Copie/pegue las propiedades del modelo original en el tipo complejo.
  4. Asigne sus procedimientos almacenados al tipo complejo .

    Espero que esto ayude a alguien.

39

Acabo de eliminar las tablas ofensivas del modelo y luego las volví a agregar y todo estaba bien.

+5

Funcionó para mí, también. Base de datos primero – vbullinger

+0

Esto todavía ocurre en EF5, y esta fue la solución que funcionó para mí. En mi caso, eliminé una columna y agregué una relación de clave externa a la tabla (en caso de que ayude a alguien a descubrir por qué). Base de datos primero también. – Crwth

+0

Parece la mejor solución y fácil de recordar. Simplemente eliminaré y a partir de ahora agregaré si cambio la base de datos. – Nick

27

Para aquellos de ustedes que están creando un modelo a partir de una base de datos, tuve este problema después de realizar cambios en mi base de datos. Sucedió cuando cambié un nombre de campo en el DB por una razón u otra (creo que también sucede si cambias un tipo de datos).

La solución, para mí, era hacer clic derecho en el espacio de trabajo y seleccionar "Actualizar el modelo desde la base de datos". Esto debería agregar las propiedades de la BD a su modelo, sin embargo, NO elimina sus propiedades anteriores y éstas le darán el error 3004.

Haga clic derecho en el espacio de trabajo y seleccione "Validar". Esto debería darle una lista de errores que muestra las propiedades ofensivas. Luego puede hacer clic con el botón derecho en cada propiedad ofensiva y eliminarla manualmente de su modelo.

Esto me solucionó el problema. Espero que ayude a alguien más.

+0

** Esto debería proporcionarle una lista de errores que muestra las propiedades ofensivas. A continuación, puede hacer clic con el botón derecho en cada propiedad infractora y eliminarla manualmente de su modelo. ** esto. –

+0

"Haga clic derecho en el espacio de trabajo y seleccione 'Validar'" Hmm, hice clic derecho en el diagrama que VS genera a partir del archivo edmx y elegí "Validar". No vi ningún error. ¿Estaba validando algo equivocado? –

+0

resolvió mi problema, el mío ocurrió porque estaba tratando de hacer algo de código primero. Mientras que antes estaba usando db forst. Que cuando falla, agrego tablas en db y los modelos actualizados y surgen los problemas. hubo 2 campos que quité y funcionó (Y) –

0

Recibí el mismo problema después de cambiar el nombre de una propiedad en una de mis entidades.

Descubrí que el mapeo entre la propiedad de mi entidad y la columna correspondiente en la tabla no estaba configurado.

Puede configurar esto usando el editor haciendo clic derecho sobre la entidad en el modelo y seleccionando "Table mapping". Asegúrese de que las propiedades estén asignadas a una columna en la base de datos.

Editar: También necesitaba volver a ejecutar mi archivo tt para generar las nuevas clases. (Podría haber sido desde que lo tengo en otro proyecto?)

0

Después de revisar el archivo xml (edmx), mover el modelo a otro proyecto y darse cuenta de que todo está bien, decidí cerrar y abrir Visual Studio y compilar Againt, luego el error desaparece.

10

Si desea modificar su base de datos sin regenerar todo el modelo o recreando su base de datos desde el modelo, me parece más fácil y seguro modificar las propiedades en el diagrama de EDMX a través de Visual Studio y luego ajustar manualmente las asignaciones que visual studio no da acceso a.

El error le dará un número de línea:

problema en fragmentos de mapeo a partir de la línea

Sólo tiene que abrir el archivo edmx en un editor de texto, vaya a esa línea y debería ser bastante obvio lo que necesita ser arreglado. Hay una sección que se vería así:

<EntityTypeMapping TypeName="YourModel.YourType"> 
    <MappingFragment StoreEntitySet="YourType"> 
    <ScalarProperty Name="PropertyName1" ColumnName="DatabaseColumn1" /> 
    <ScalarProperty Name="PropertyName2" ColumnName="DatabaseColumn2" /> 
    ... 
    </MappingFragment> 
</EntityTypeMapping> 

Sólo asegúrese de que hay un nodo para cada propiedad de nombre/columna que necesita, y que todas las propiedades también se enumeran en la sección <EntityType Name="YourTable"> en la parte superior del documento edmx

+0

Esta fue una buena decisión, aunque puede ser peligroso si estropea algo :) – user1477388

+0

Esto resuelve el problema, aunque me sorprende que agregar una columna a la vista gráfica de edmx no lo haga. Desearía poder darte más puntos ... –

1

Otra alternativa para hacerlo sin eliminar la tabla del diagrama y volver a agregarla es utilizar la opción de asignación de tabla.

  1. Goto para el modelo de navegador
  2. clic derecho sobre el nombre de la tabla.
  3. Elija la asignación de tablle
  4. Visual Studio mostrará una ventana con columnas de tabla de coincidencia/falta de propiedades EF.
  5. Seleccionar/partido columna correspondiente a bienes desaparecidos

enter image description here

Cuestiones relacionadas