C# 实体框架赢得';不包括所有表

C# 实体框架赢得';不包括所有表,c#,sql-server,entity-framework,entity-framework-6,C#,Sql Server,Entity Framework,Entity Framework 6,我有一组简单的3张表,EF知道它们是相关的 在我的存储库中,我执行以下操作 var result = localContext.LexiconTerms.Include(i=>i.Locale).Include(i=>i.Lexicon) 当我检查结果时,词典总是填充的,区域设置总是null 现在,如果我看一下生成的SQL,我会看到 SELECT [Extent1].[Id] AS [Id], [Extent1].[LexiconId] AS [Lexico

我有一组简单的3张表,EF知道它们是相关的

在我的存储库中,我执行以下操作

var result = localContext.LexiconTerms.Include(i=>i.Locale).Include(i=>i.Lexicon)
当我检查结果时,词典总是填充的,区域设置总是
null

现在,如果我看一下生成的SQL,我会看到

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)
这清楚地表明EF正在获取数据。此外,在SSMS中运行SQL,我可以看到所有3个表的所有适当值

那么,我在做什么/不做什么来阻止EF填充一个相关对象而不是另一个

我知道我可以通过创建一个视图来克服这个问题,但我正试图理解EF在做什么

编辑: 我在EF中首先使用数据库。这些是EF生成的类

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; }
}
公共部分类词典
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共词汇()
{
this.LexiconTerms=new HashSet();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共可为空的DeletedOn{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection词汇项{get;set;}
}
公共部分类词汇术语
{
公共int Id{get;set;}
public int LexiconId{get;set;}
公共字符串ResourceId{get;set;}
公共字符串值{get;set;}
公共字符串LocaleId{get;set;}
公共字符串ResourceSet{get;set;}
公共字符串类型{get;set;}
公共字节[]BinFile{get;set;}
公共字符串文本文件{get;set;}
公共字符串文件名{get;set;}
公共字符串注释{get;set;}
public int ValueType{get;set;}
公共可空更新的{get;set;}
公共虚拟词典词典{get;set;}
公共虚拟区域设置区域设置{get;set;}
}
公共部分类区域设置
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共语言环境()
{
this.LexiconTerms=new HashSet();
}
公共字符串名称{get;set;}
公共字符串LocaleCode{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection词汇项{get;set;}
}

您迫切需要加载,因此需要像这样更改代码

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

这是一份有用的文件


您是否使用代码优先的方法?能否显示实体类?导航属性是否标记为虚拟?老实说,我认为这只是用于延迟加载,但可能值得一试。我已经更新了Q以显示所使用的类。EF知道
Locale.LocaleCode
是主键吗?呵呵,呵呵,@StuartHemming,在语句末尾追加
toList()
,看看会发生什么。
var result = localContext.LexiconTerms.Include("Locale.Lexicon")