我有以下实体:
人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();
}
答案 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;