2015-12-03 10 views
7

ich einen einfachen Satz von drei Tabellen haben, die EF weiß verwandt sind ...Entity Framework Wird nicht include() alle Tabellen

Lexicon<=>LexiconTerms

Local<=>LexiconTerms

In meinem Repository ich ausführen die folgende ...

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

Wenn ich die Ergebnisse Lexikon untersuchen ist immer bevölkert und Locale ist immer null

Nun, wenn ich an der SQL sehen erzeugte ich das sehen ...

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) 

die deutlich zeigt, dass EF die Daten abruft. Um ferner die SQL in SSMS läuft, kann ich alle entsprechenden Werte für alle drei der Tische ...

SQL Results

So sehen, was mache ich/nicht, dass verhindert EF die eine ähnliche bevöl tun Objekt und nicht das andere?

Ich weiß, dass ich dieses Problem umgehen kann, indem ich zum Beispiel eine Ansicht erstelle, aber ich versuche zu verstehen, was EF macht.

EDIT: Ich benutze Datenbank zuerst in EF. Dies sind die Klassen, die EF generiert hat ...

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

Verwenden Sie-Code First-Ansatz? Können Sie Ihre Entitätsklassen zeigen? –

+0

Nein, es ist DB zuerst. –

+0

Sind Ihre Navigationseigenschaften als virtuell markiert? Um ehrlich zu sein, denke ich, dass es nur zum faulen Laden ist, aber es könnte einen Versuch wert sein. – Rob

Antwort

1

Sie verwenden eifrig laden, also müssen Sie Ihren Code so ändern.

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

ODER

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

Es ist nützliches Dokument

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

Verwandte Themen