2015-12-03 6 views
7

Ho un semplice insieme di 3 tabelle che EF sa sono legati ...Entity Framework non includerà() tutte le tabelle

Lexicon<=>LexiconTerms

Local<=>LexiconTerms

Nel mio repository eseguo il seguente ...

var result = localContext.LexiconTerms.Include(i=>i.Locale).Include(i=>i.Lexicon) 

Quando ho esaminare i risultati Lexicon è sempre popolata e Locale è sempre null

Ora, se guardo il codice SQL generato vedo questo ...

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[LexiconId] AS [LexiconId], 
    [Extent1].[ResourceId] AS [ResourceId], 
    [Extent1].[Value] AS [Value], 
    [Extent1].[LocaleId] AS [LocaleId], 
    [Extent1].[ResourceSet] AS [ResourceSet], 
    [Extent1].[Type] AS [Type], 
    [Extent1].[BinFile] AS [BinFile], 
    [Extent1].[TextFile] AS [TextFile], 
    [Extent1].[Filename] AS [Filename], 
    [Extent1].[Comment] AS [Comment], 
    [Extent1].[ValueType] AS [ValueType], 
    [Extent1].[Updated] AS [Updated], 
    [Extent2].[Name] AS [Name], 
    [Extent2].[LocaleCode] AS [LocaleCode], 
    [Extent3].[Id] AS [Id1], 
    [Extent3].[Name] AS [Name1], 
    [Extent3].[Description] AS [Description], 
    [Extent3].[DeletedOn] AS [DeletedOn] 
    FROM [Locale].[LexiconTerms] AS [Extent1] 
    INNER JOIN [Locale].[Locale] AS [Extent2] ON [Extent1].[LocaleId] = [Extent2].[LocaleCode] 
    INNER JOIN [Locale].[Lexicon] AS [Extent3] ON [Extent1].[LexiconId] = [Extent3].[Id] 
    WHERE (N'Test1' = [Extent1].[ResourceId]) AND (N'UnitTest' = [Extent1].[ResourceSet]) AND (-2 = [Extent1].[LexiconId]) AND ([Extent1].[LocaleId] = @p__linq__0) 

che dimostra chiaramente che EF è il recupero dei dati. Inoltre, l'esecuzione del SQL in SQL Server Management Studio, posso vedere tutti i valori appropriati per tutti e 3 i tavoli ...

SQL Results

Allora, che cosa sto facendo/non fare che EF impedisce popolando quello relativo oggetto e non l'altro?

So che posso superare questo problema, ad esempio, creando una vista, ma sto cercando di capire che cosa sta facendo EF.

MODIFICA: Sto utilizzando Database First in EF. Queste sono le classi che EF ha generato ...

public partial class Lexicon 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Lexicon() 
    { 
     this.LexiconTerms = new HashSet<LexiconTerm>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public Nullable<System.DateTime> DeletedOn { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<LexiconTerm> LexiconTerms { get; set; } 
} 

public partial class LexiconTerm 
{ 
    public int Id { get; set; } 
    public int LexiconId { get; set; } 
    public string ResourceId { get; set; } 
    public string Value { get; set; } 
    public string LocaleId { get; set; } 
    public string ResourceSet { get; set; } 
    public string Type { get; set; } 
    public byte[] BinFile { get; set; } 
    public string TextFile { get; set; } 
    public string Filename { get; set; } 
    public string Comment { get; set; } 
    public int ValueType { get; set; } 
    public Nullable<System.DateTime> Updated { get; set; } 

    public virtual Lexicon Lexicon { get; set; } 
    public virtual Locale Locale { get; set; } 
} 

public partial class Locale 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Locale() 
    { 
     this.LexiconTerms = new HashSet<LexiconTerm>(); 
    } 

    public string Name { get; set; } 
    public string LocaleCode { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<LexiconTerm> LexiconTerms { get; set; } 
} 
+0

Si sta utilizzando Codice Primo approccio? Puoi mostrare le tue classi di entità? –

+0

No, è DB First. –

+0

Le proprietà di navigazione sono contrassegnate come 'virtuali'? Per essere onesti, penso che sia solo per il carico pigro, ma potrebbe valere la pena provare. – Rob

risposta

1

si utilizza con entusiasmo loading quindi è necessario modificare il codice in questo modo.

var result = localContext.LexiconTerms.Include(i=>i.Locale.Lexicon) 

O

var result = localContext.LexiconTerms.Include("Locale.Lexicon") 

è utile documento

https://msdn.microsoft.com/en-us/data/jj574232.aspx