LazyLoadingEnabled false 但仍未加载
LazyLoadingEnabled false but still not loading
我的 EF 代码优先数据模型中有以下内容:
public class B
{
[Key]
public int Id { get; set; }
... some data ..
}
public class D: B
{
public D() { RelatedData = new List<RelatedData>(); }
public List<RelatedData> RelatedData { get; set; }
}
public class RelatedData
{
[Key]
public int Id { get; set; }
public int DId { get; set; }
... some data ...
}
在数据库中,我要查找一条记录D,它有2条RelatedData记录。
我的访问例程通过基class获取数据。
B Lookup(int desiredId)
{
...
using (MyDataContext db = new MyDataContext())
{
db.Configuration.LazyLoadingEnabled = false;
B b = (from x in db.B
where x.Id == desiredId
select x).FirstOrDefault();
// b is actually a type D; however, ReleatedData has no records.
// If I serialize b and return it, ReleatedData is empty.
// Running this silly code below when I am dealing with a type D
// which really only hits the DB and throws away the data now forces
// the related data in b to load.
if ( b is D)
{
var notUsed = (from r in db.RelatedData
where r.DId == desiredId
select r).ToList();
// Serializing b now gives valid results.
}
}
}
}
为什么我必须执行检索相关数据的额外步骤? LazyLoadingEnabled = false 是否应在第一次查询期间强制加载所有相关数据?
在此先感谢您的帮助。
一个解决方案可以是首先使用 OfType
扩展方法仅与 D
实体一起使用,然后使用 Include
扩展方法来预先加载 RelatedData
导航 属性.
var d= db.B.OfType<D>().Include(d=>d.RelatedData).FirstOrDefault(d=>d.Id == desiredId);
关于您的问题,您不需要执行额外的查询来加载相关实体。如果您再次启用延迟加载并将 RelatedData
属性 声明为 virtual
,您将在第一次查询后查询 属性 时看到 EF 将加载该相关实体。如果您想查看在 POCO 实体中需要遵循的要求,请选中此 link.
更新
好吧,正如我在评论中所说,也许您遗漏了一些无法让延迟加载正常工作的东西。
另一种解决方案可能是 load explicitly 导航 属性:
D entity= b as D;
context.Entry(entity).Collection(p => p.RelatedData).Load();
我的 EF 代码优先数据模型中有以下内容:
public class B
{
[Key]
public int Id { get; set; }
... some data ..
}
public class D: B
{
public D() { RelatedData = new List<RelatedData>(); }
public List<RelatedData> RelatedData { get; set; }
}
public class RelatedData
{
[Key]
public int Id { get; set; }
public int DId { get; set; }
... some data ...
}
在数据库中,我要查找一条记录D,它有2条RelatedData记录。
我的访问例程通过基class获取数据。
B Lookup(int desiredId)
{
...
using (MyDataContext db = new MyDataContext())
{
db.Configuration.LazyLoadingEnabled = false;
B b = (from x in db.B
where x.Id == desiredId
select x).FirstOrDefault();
// b is actually a type D; however, ReleatedData has no records.
// If I serialize b and return it, ReleatedData is empty.
// Running this silly code below when I am dealing with a type D
// which really only hits the DB and throws away the data now forces
// the related data in b to load.
if ( b is D)
{
var notUsed = (from r in db.RelatedData
where r.DId == desiredId
select r).ToList();
// Serializing b now gives valid results.
}
}
}
}
为什么我必须执行检索相关数据的额外步骤? LazyLoadingEnabled = false 是否应在第一次查询期间强制加载所有相关数据?
在此先感谢您的帮助。
一个解决方案可以是首先使用 OfType
扩展方法仅与 D
实体一起使用,然后使用 Include
扩展方法来预先加载 RelatedData
导航 属性.
var d= db.B.OfType<D>().Include(d=>d.RelatedData).FirstOrDefault(d=>d.Id == desiredId);
关于您的问题,您不需要执行额外的查询来加载相关实体。如果您再次启用延迟加载并将 RelatedData
属性 声明为 virtual
,您将在第一次查询后查询 属性 时看到 EF 将加载该相关实体。如果您想查看在 POCO 实体中需要遵循的要求,请选中此 link.
更新
好吧,正如我在评论中所说,也许您遗漏了一些无法让延迟加载正常工作的东西。
另一种解决方案可能是 load explicitly 导航 属性:
D entity= b as D;
context.Entry(entity).Collection(p => p.RelatedData).Load();