2012-02-10 26 views
5

Actualmente estoy teniendo algunos problemas con EF4.1. La generación del SQL no parece coincidir con lo que espero que se genere en función de mis clases. Tengo las siguientes clases (Esto es sólo un conjunto más pequeño de una colección grande, sin embargo, aquí es donde parecen estar teniendo problemas) ...Entity Framework 4.1 Ghost Columns

public class CustomEntityContext : DbContext 
{ 
    public CustomEntityContext() 
      :base(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString) {} 

    public DbSet<Person> People { get; set; } 
    public DbSet<Occurrence> Occurrences { get; set; } 
    public DbSet<OccurrenceSecurity> OccurrenceSecurities { get; set; } 
} 


[DataContract(IsReference = true)] 
[Table("Occurrence")] 
public class Occurrence 
{ 
    [DataMember] public int ID { get; set; } 
    [DataMember] public string Number { get; set; } 
    [DataMember] public bool? IsMOR { get; set; } 
    [DataMember] public bool? IsConfidential { get; set; } 
    [DataMember] public int? IncidentID { get; set; } 
    [DataMember] public bool? CanPublish { get; set; } 
    [DataMember] public bool? IsFeedbackRequired { get; set; } 
    [DataMember] public bool? IsRegulatorReport { get; set; } 
    [DataMember] public DateTime? RecordedDate { get; set; } 
    [DataMember] public DateTime? ReportedDate { get; set; } 
    [DataMember] public int? ReportTypeID { get; set; } 
    [DataMember] public bool? IsMain { get; set; } 
    [DataMember] public bool? IsRejected { get; set; } 
    [DataMember] public string Title { get; set; } 
    [DataMember] public byte[] Version { get; set; } 
    [DataMember] public string ReportDataXml { get; set; } 
    [DataMember] public int? LocationID { get; set; } 
    [DataMember, ForeignKey("RecordedByPersonID")] public Person Recorder { get; set; } 
    [DataMember, ForeignKey("ReportedByPersonID")] public Person Reporter { get; set; } 
} 

[DataContract(IsReference = true)] 
[Table("OccurrenceSecurity")] 
public class OccurrenceSecurity 
{ 
    [DataMember, Key, Column("PersonID", Order = 0)] public int PersonID { get; set; } 
    [DataMember, ForeignKey("PersonID")] public Person Person { get; set; } 
    [DataMember, Key, Column("OccurrenceID", Order = 1)] public int OccurrenceID { get; set;   
    [DataMember, ForeignKey("OccurrenceID")] public Occurrence Occurrence { get; set; } 
} 

[DataContract(IsReference = true)] 
[Table("Person")] 
public class Person 
{ 
    [DataMember] public int ID { get; set; } 
    [DataMember] public string FullName { get; set; } 
    //[DataMember] public Occurrence[] RecordedOccurrences { get; set; } 
    //[DataMember] public Occurrence[] ReportedOccurrences { get; set; } 
    //[DataMember] public OccurrenceSecurity[] OccurrenceSecurities { set; get; } 
} 

Cuando pido las OccurrenceSecurities, con los métodos incluyen , Solicito incluir tanto la Ocurrencia como la Persona. Posteriormente, el SQL que se genera es el siguiente ...

SELECT 
[Extent1].[PersonID] AS [PersonID], 
[Extent1].[OccurrenceID] AS [OccurrenceID], 
[Extent2].[ID] AS [ID], 
[Extent2].[FullName] AS [FullName], 
[Extent3].[ID] AS [ID1], 
[Extent3].[Number] AS [Number], 
[Extent3].[IsMOR] AS [IsMOR], 
[Extent3].[IsConfidential] AS [IsConfidential], 
[Extent3].[IncidentID] AS [IncidentID], 
[Extent3].[CanPublish] AS [CanPublish], 
[Extent3].[IsFeedbackRequired] AS [IsFeedbackRequired], 
[Extent3].[IsRegulatorReport] AS [IsRegulatorReport], 
[Extent3].[RecordedByPersonID] AS [RecordedByPersonID], 
[Extent3].[RecordedDate] AS [RecordedDate], 
[Extent3].[ReportedByPersonID] AS [ReportedByPersonID], 
[Extent3].[ReportedDate] AS [ReportedDate], 
[Extent3].[ReportTypeID] AS [ReportTypeID], 
[Extent3].[IsMain] AS [IsMain], 
[Extent3].[IsRejected] AS [IsRejected], 
[Extent3].[Title] AS [Title], 
[Extent3].[Version] AS [Version], 
[Extent3].[ReportDataXml] AS [ReportDataXml], 
[Extent3].[LocationID] AS [LocationID], 
[Extent3].[Person_ID] AS [Person_ID],    -- Where does this come from? 
[Extent3].[Person_ID1] AS [Person_ID1]    -- Where does this come from? 
FROM [dbo].[OccurrenceSecurity] AS [Extent1] 
INNER JOIN [dbo].[Person] AS [Extent2] ON [Extent1].[PersonID] = [Extent2].[ID] 
LEFT OUTER JOIN [dbo].[Occurrence] AS [Extent3] ON [Extent1].[OccurrenceID] = [Extent3].[ID] 

Como se puede ver, hay 2 columnas al final del Seleccionar bloque que está seleccionando Person_ID y Person_ID1. Estos no existen en mi tabla subyacente, o en mi objeto.

¿Alguien sabe de dónde vienen y por qué están allí?

Además, soy consciente de que esta es una relación de Muchos a Muchos, sin embargo, la tabla/clase de OccurrenceSecurities se extenderá para contener más datos.

Gracias, David

+0

Acabo de intentar configurar el modelo utilizando el método OnModelCreating en la clase DbContext. Copié la configuración de cada atributo en las Entidades, eliminé los atributos de esos y ahora se genera la consulta SQL sin esas 2 columnas adicionales –

Respuesta

2

con los métodos incluyen, les pido que incluya tanto la ocurrencia y la persona

Estas columnas adicionales serán utilizados por EF para construir el gráfico de objetos de la consulta resultados. Al usar Include, está diciendo "solo quiero ejecutar un comando de tienda, pero quiero recuperar muchos objetos". En lugar de utilizar varios conjuntos de resultados (que no todos los almacenes de respaldo apoyarán), EF vez emite una consulta con resultados como este, cuando se consulta A.Include("B.C"):

columns for A1 columns for B1 columns for C1 
columns for A1 columns for B1 columns for C2 
columns for A1 columns for B1 columns for C3 
columns for A1 columns for B2 columns for C4 
columns for A1 columns for B2 columns for C5 
columns for A2 columns for B3 columns for C6 
columns for A2 columns for B3 columns for C7 

y luego se cose conjuntamente estas filas para hacer dos A, 3 B s y 7 C s, con las relaciones apropiadas.

Las columnas extra particulares que muestra son utilizadas por EF en el proceso de unión, es mi suposición.

Cuestiones relacionadas