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();
}
这是因为您可能没有定义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;
懒惰加载已禁用,不幸的是,它仍然没有加载 – xeraphim
什么是'context.GetQuery '? – DavidG
我已经为原始问题添加了GetQuery 方法的代码:) – xeraphim
那么这是一个相当复杂的方式,只是做'返回这个。Set();':) –
DavidG