2011-11-23 8 views
7

Estamos intentando que Entity Framework funcione en nuestra tienda con una base de datos existente (y por lo tanto, cambiar el esquema de base de datos NO es una opción) y las pruebas unitarias que creamos para probar cosas muestran un comportamiento realmente extraño.Entity Framework: ¿De dónde diablos es obtener estas columnas?

Este es el SQL que escupe para un objeto específico que tenemos:

SELECT 
[Extent1].[CommentTypeId] AS [CommentTypeId], 
[Extent1].[DataPartId] AS [DataPartId], 
[Extent1].[CommentId] AS [CommentId], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Message] AS [Message], 
[Extent1].[From] AS [From], 
[Extent1].[Likes] AS [Likes], 
[Extent1].[SourceTypeId] AS [SourceTypeId], 
[Extent1].[StatusMessage_DataPartId] AS [StatusMessage_DataPartId], 
[Extent1].[Album_DataPartId] AS [Album_DataPartId] 
FROM [dbo].[Comments] AS [Extent1] 

Las dos últimas columnas solicitadas, como se puede notar, no son como los demás. ¡Eso se debe a que en realidad no existen, y no tenemos idea de por qué Entity los está solicitando! Ni nuestros archivos de configuración ni nuestros POCO hacen ninguna mención de ellos en absoluto. De hecho, en lo que respecta a nuestra base de datos, son conceptos completamente independientes y no están directamente relacionados.

¿De dónde saca estas columnas, y cómo le digo que las corte?

EDITAR: Para responder a algunas de las preguntas a continuación, 1) Estamos utilizando Entity Framework 4.2. Estamos usando un mapeo fluido.

2) La propia POCO se parece a esto, con el lío igualdad cortar en aras de la brevedad:

public long DataPartId { get; set; } 
public string CommentId { get; set; } 
public DateTime? CreatedTime { get; set; } 
public string Message { get; set; } 
public string From { get; set; } 
public int? Likes { get; set; } 
public string SourceTypeId { get; set; } 
public int CommentTypeId { get; set; } 

public virtual DataPart DataPart { get; set; } 
public virtual CommentType CommentType { get; set; } 

3) No estamos utilizando edmx. Tenemos un DbContext personalizado. No hay demasiadas líneas que sean terriblemente interesantes. Estos dos son probablemente de interés:

Configuration.LazyLoadingEnabled = true; 
    Configuration.ProxyCreationEnabled = true; 

Más allá de eso, el archivo de contexto es un montón de

modelBuilder.Configurations.Add(new WhateverConfiguration()) 

y

public IDbSet<WhateverPoco> PocoDatabaseTableAccessor { get; set; } 

4) Empezamos con db-primero, pero eso no funcionó, por lo que actualmente estamos haciendo código primero.

5) Se trata de las entrañas de la configuración para que POCO específica:

HasRequired (x => x.DataPart) 
     .WithRequiredDependent (x => x.Comment); 

    HasRequired (x => x.CommentType) 
     .WithMany (x => x.Comments) 
     .HasForeignKey (x => x.CommentTypeId); 

    HasKey (x => x.DataPartId); 
    ToTable ("Comments", "dbo"); 
+4

¿Cómo está usando el marco de entidades? ¿Estás usando un mapeo fluido o usando un archivo edmx? ¿Estás utilizando la ingeniería inversa integrada en el diseñador? ¿Qué versión del marco de la entidad? ¿Puedes publicar una captura de pantalla de las partes relevantes de tu modelo de datos? –

+0

Muestra el modelo, las clases POCO o el DbContext personalizado. –

+2

Parece que podrían ser campos de clave externa generados primero por código. – jrummell

Respuesta

4

El problema no está en el mapeo o la clase que mostró. Compruebe sus clases Album y StatusMessage. ¿Son entidades? ¿Están mapeados? ¿Tienen propiedades de navegación de colección para comentarios? En caso afirmativo, EF espera que Comment tenga FK en estas tablas. Si la tabla no tiene dicha columna, no puede tener asignadas estas propiedades de navegación en esas entidades.

Btw. ¿No debería el ID en la tabla Comments ser CommentId en lugar de DataPartId?

+0

No. CommentId es un identificador único para la configuración de otra persona. DataPartId es el identificador único para nuestro propio esquema, se vincula a una tabla centralizada que nos permite relacionar estas cosas juntas en un formato uniforme; esto es importante porque una de las principales funciones del producto que estamos construyendo es la agregación y el análisis de datos. . – tmesser

+0

Además, bullseye: alguien agregó propiedades de navegación en StatusMessage y Álbum sin mi conocimiento. Los eliminé y las pruebas unitarias ahora muestran diferentes errores. Apreciar la ayuda, +1 y aceptado. – tmesser

+1

Este es un error extraño, simplemente pasó por una prueba similar. Cuando elimine las propiedades de navegación, siempre asegúrese de eliminarlas también de las tablas relacionadas. – Eugene

0

Abra la .edmx en un XML Editor y la búsqueda de estas columnas. Deben estar en algún lugar de tu modelo.

EDITAR: su pregunta original no menciona que está utilizando el código primero. Me pregunto cuál fue tu problema primero con Database, que generalmente funciona bien. Primero con el código o el modelo, normalmente crea la base de datos después de crear el modelo (usando scripts SQL generados).

Declaraste las dos últimas propiedades como virtuales, es por eso que el SQL generado tiene un aspecto diferente. Del código que nos muestra no podemos ver de dónde proviene la referencia al álbum.

Como tiene la base de datos, generaría el .edmx del modelo en un proyecto. Luego puede usar un generador de código POCO o un generador de entidad de auto-seguimiento para generar las entidades y almacenarlas en un proyecto diferente. O puede escribirlos manualmente como ya lo hizo. Los nombres de propiedad deben corresponder con las columnas en la base de datos.

+0

No sugiera cambios en el proceso como forma principal de solucionar un problema. No es útil. No puedo explicar por qué no es útil en este caso debido a los estándares de seguridad de la tienda, pero en el futuro considere estas soluciones como un segundo, tercer o último recurso. – tmesser

+1

Lo siento, solo intenté ayudar. Y mi primera suposición no fue tan mala porque no sabía cómo usaste el marco de la entidad. Una simple búsqueda de texto en su entidad probablemente habría ayudado. Espero que mis explicaciones futuras te ayuden en el futuro. No sabía qué tan lejos estás en el proyecto. ¿Fue mi respuesta realmente tan mala que recibí un voto negativo? Al menos lo intenté lo mejor posible. – slfan

1

Entity Framework, como MVC, usa mucha convención sobre la configuración. Eso significa que asume ciertas cosas a menos que le diga que no lo haga.

Sin embargo, algo es realmente extraño aquí según la información que ha proporcionado. De acuerdo con la consulta SQL, esto proviene de la tabla Comentarios, sin embargo, su asignación fluida dice que DataPartId es la clave principal. ¿Tiene asignaciones adicionales de clave principal con fluidez? Si no, tus asignaciones pueden estar equivocadas. ¿Ha comprobado la base de datos real generada para ver si el modelo de datos coincide con lo que está tratando de hacer?

Supongo que sus clases StatusMessage y Album tienen propiedades de navegación para Comment, pero como solo ha definido DataPartId como su clave principal, ese es el valor que está usando para buscar los comentarios, no CommentId.

+0

Sí, alguien agregó propiedades de navegación sin cablear correctamente las claves foráneas en la configuración. Simplemente no sabía cómo interpretar el error. Apreciar la ayuda. – tmesser

Cuestiones relacionadas