尽管使用了include,EF6仍未加载导航属性

时间:2017-09-20 08:48:45

标签: c# sql .net entity-framework entity-framework-6

我有以下实体:

  

人1 --- * PersonAdresse * --- 1 Adresse

当试图通过调用PersonRepository.GetPersonen(...)加载具有PersonAdresses的人时,我只获得Personen(填写了Id,Name,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();
}

尽管使用.Include(...),为什么PersonAdresse和Adresse无法加载?

提前致谢

Edit1:EF-Context-Class上的GetQuery-Method:

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

2 个答案:

答案 0 :(得分:1)

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

否则,可能是因为你正在做AsQueryable()。 DbSet已经可以使用其他逻辑进行查询,因此请将其更改为:

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

答案 1 :(得分:0)

我建议您使用实体框架实体的强类型来避免加载时对EF的混淆。我不确定为什么但在使用Interfaces而不是像List这样的集合类型时遇到了问题。

如果我错了,或者Missing Something给了我一些在EF实体中使用收藏界面时不做和不做,为了我的自我改进。

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

context.Configuration.LazyLoadingEnabled = false;