为什么从EF 4.2 POCO中的数据库检索时,我的导航属性为空
本文关键字:我的 导航 属性 检索 数据库 EF POCO 为什么 | 更新日期: 2023-09-27 18:21:36
我有一个非常简单的数据模型(如下)。我很难弄清楚如何从数据库中加载导航属性。我很容易把它们放进去,但导航属性似乎不是由EF设置的。我看到了几个相关的问题,但它们略有不同,或者相当复杂。我正在寻找有关EF 4.2(POCO)如何处理导航属性的信息。在我所做的阅读中,我得到的印象是,我可以使用导航属性访问带有外键的对象。相反,我的属性返回为null或空,这取决于我是否在构造函数中实例化我的集合。
public class AnimalDb : DbContext
{
public static AnimalDb Create(string fileName)
{
Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
return new AnimalDb(fileName);
}
private AnimalDb(string fileName) : base(fileName) { }
public DbSet<Animal> Animals { get; set; }
}
public class Animal
{
public Animal()
{
Id = Guid.NewGuid();
Traits = new ObservableCollection<Trait>();
}
public Guid Id { get; set; }
public string Species { get; set; }
public string Name { get; set; }
public ObservableCollection<Trait> Traits { get; set; }
}
public class Trait
{
public Trait()
{
Id = Guid.NewGuid();
}
public Guid Id { get; set; }
public string Name { get; set; }
}
下面是一些使用它的(简单)代码:
foreach (var animal in db.Animals)
{
foreach (var trait in animal.Traits)
{
//animal.Traits count is 0, so this does not run.
//However there are traits in the database, as my populate
//function is working fine.
Console.WriteLine("{0} is {1}", animal.Name, trait.Name);
}
}
----编辑答案摘要----
使用这篇文章和下面答案中提供的信息,我发现我可以急切地使用db加载。Animals.Include()或启用延迟加载。有一个技巧可以启用延迟加载并能够使用它。第一个启用延迟加载我添加了:
db.Configuration.LazyLoadingEnabled = true;
接下来,我以以下方式更改了我的特征集合:
public virtual ObservableCollection<Trait> Traits { get; set; }
使其虚拟化允许自动生成的代理延迟加载特性。就是这样!IMHO我认为MSDN文档应该在POCO EF 4.2编码约定中喊出这个负载并明确。再次感谢您的帮助。
您的连接方法可能没有数据,这有几个原因。要加载相关数据,您需要:
- 显式加载数据
- 满足延迟加载要求,或
- 使用
Include()
使用热切加载
我的猜测是你关闭了虚拟代理。这里有更多关于要求的信息:
http://msdn.microsoft.com/en-us/library/dd456855.aspx
如果不使用延迟加载,则必须明确告知EF使用Include方法加载关系:
foreach (var animal in db.Animals.Include(a => a.Traits))
{
foreach (var trait in animal.Traits)
{
//...
}
}
你可以在这篇文章中阅读更多关于热切加载的内容。