EF6不加载导航属性

问题描述:

我有以下实体:EF6不加载导航属性

人1 --- * PersonAdresse * --- 1住址

当试图加载者与PersonAdresses调用PersonRepository.GetPersonen(...)我只得到Personen(含填写ID,姓名,Vorname),但空PersonAdresse ...

我确信,有在数据库中的个人条目在,为人员和地址。

EF产生下面的SQL(一个简单的SQL,没有加入或任何东西):

exec sp_executesql N'SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[Vorname] AS [Vorname] 
FROM [dbo].[Person] AS [Extent1] 
WHERE (([Extent1].[Name] = @p__linq__0) OR (([Extent1].[Name] IS NULL) AND (@p__linq__0 IS NULL))) AND (([Extent1].[Vorname] = @p__linq__1) OR (([Extent1].[Vorname] IS NULL) AND (@p__linq__1 IS NULL)))',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'Mustermann',@p__linq__1=N'Max' 

实体:

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

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Vorname { get; set; } 

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

public partial class PersonAdresse 
{ 
    public int Id { get; set; } 
    public int PersonId { get; set; } 
    public int AdresseId { get; set; } 

    public virtual Adresse Adresse { get; set; } 
    public virtual Person Person { get; set; } 
} 

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

    public int Id { get; set; } 
    public string Strasse { get; set; } 
    public string Ort { get; set; } 
    public int Plz { get; set; } 

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

PersonRepository:

public ICollection<Person> GetPersonen(PersonQueryCriteria personQueryCriteria) 
{ 
    var query = this.Context.GetQuery<Person>() 
        .Include(q => q.PersonAdresse) 
        .Include($"{nameof(Person.PersonAdresse)}.{nameof(PersonAdresse.Adresse)}"); 

    if (!string.IsNullOrEmpty(personQueryCriteria.NameFilter)) { 
     query = query.Where(p => p.Name == personQueryCriteria.NameFilter); 
    } 

    if (!string.IsNullOrEmpty(personQueryCriteria.VornameFilter)) 
    { 
     query = query.Where(p => p.Vorname == personQueryCriteria.VornameFilter); 
    } 

    return query.ToList(); 
} 

为什么做PersonAdresse尽管使用了0123,Adresse仍然没有加载?

在此先感谢

EDIT1:GetQuery法的EF-上下文类:

public IQueryable<T> GetQuery<T>() where T : class 
{ 
    return (IQueryable<T>)this.Set(typeof(T)).AsQueryable(); 
} 
+0

什么是'context.GetQuery '? – DavidG

+0

我已经为原始问题添加了GetQuery 方法的代码:) – xeraphim

+0

那么这是一个相当复杂的方式,只是做'返回这个。Set ();':) – DavidG

这是因为您可能没有定义Person和PersonAddresse之间的FK关系。默认情况下,它会加入Id => Id,我相信,所以你必须告诉EF Person.Id - > PersonAddresse.PersonId。

否则,这可能是因为你在做AsQueryable()。 DbSet已经可以通过额外的逻辑进行查询,因此请将其更改为:

this.Context.Set<Person>()... instead of that GetQuery call. 

我会建议你使用强类型的实体框架的实体,以避免混淆为EF时加载。我不确定为什么,但在使用接口而不是像列表这样的集合类型时遇到了问题。

如果我错了,或者错过了一些东西给我一些在EF实体中使用集合接口时做什么和不该做什么,为了我的自我改进。

要回答您的问题,您可以使用以下代码行全局禁用延迟加载。

context.Configuration.LazyLoadingEnabled = false; 
+0

懒惰加载已禁用,不幸的是,它仍然没有加载 – xeraphim