Ho un semplice insieme di 3 tabelle che EF sa sono legati ...Entity Framework non includerà() tutte le tabelle
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 ...
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; }
}
Si sta utilizzando Codice Primo approccio? Puoi mostrare le tue classi di entità? –
No, è DB First. –
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