2017-09-20 96 views
1

我有以下實體: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

回答

1

這是因爲您可能沒有定義Person和PersonAddresse之間的FK關係。默認情況下,它會加入Id => Id,我相信,所以你必須告訴EF Person.Id - > PersonAddresse.PersonId。

否則,這可能是因爲你在做AsQueryable()。 DbSet已經可以通過額外的邏輯進行查詢,因此請將其更改爲:

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

我會建議你使用強類型的實體框架的實體,以避免混淆爲EF時加載。我不確定爲什麼,但在使用接口而不是像列表這樣的集合類型時遇到了問題。

如果我錯了,或者錯過了一些東西給我一些在EF實體中使用集合接口時做什麼和不該做什麼,爲了我的自我改進。

要回答您的問題,您可以使用以下代碼行全局禁用延遲加載。

context.Configuration.LazyLoadingEnabled = false; 
+0

懶惰加載已禁用,不幸的是,它仍然沒有加載 – xeraphim