2012-02-10 14 views
5

Attualmente sto riscontrando alcuni problemi con EF4.1. La generazione di SQL non sembra corrispondere a ciò che mi aspetto di generare in base alle mie classi. Ho le seguenti classi (Questo è solo un insieme ridotto di una collezione più grande, tuttavia, questo è dove mi sembrano avere problemi) ...Entity Framework 4.1 Colonne Ghost

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; } 
} 

Quando chiedo per i OccurrenceSecurities, con i metodi includono , Chiedo di includere sia l'occorrenza che la persona. Successivamente, l'SQL generato è il seguente ...

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] 

Come si può vedere, ci sono 2 colonne alla fine del blocco Select che selezionano person_id e Person_ID1. Questi non esistono nella mia tabella sottostante o nel mio oggetto.

Qualcuno sa da dove vengono questi e perché sono lì?

Inoltre, sono consapevole che si tratta di una relazione molti-a-molti, tuttavia, la tabella/classe OccurrenceSecurities si estenderà per contenere più dati.

Grazie, David

+0

Ho appena provato a configurare il modello utilizzando il metodo OnModelCreating sulla classe DbContext. Ho copiato la configurazione da ciascun attributo sulle Entità, rimosso gli attributi da quelli e la query SQL ora viene generata senza quelle 2 colonne aggiuntive –

risposta

2

con i metodi includono, mi chiedono di includere sia la presenza e persona

Queste colonne extra saranno utilizzati da parte di EF per costruire l'oggetto grafico dalla query risultati. Usando Include, stai dicendo "Voglio eseguire solo il comando di negozio uno, ma voglio recuperare gli oggetti molti" . Invece di utilizzare più gruppi di risultati (che non tutti i negozi di backing supporteranno), EF emette invece una query con risultati come questo, quando si esegue una query 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 

e poi cuce insieme queste righe per fare due A, 3 B s e 7 C s, con le relazioni appropriate.

Le particolari colonne aggiuntive che vengono visualizzate sono utilizzate da EF nel processo di unione dei punti, è una mia ipotesi.

Problemi correlati