为什么从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编码约定中喊出这个负载并明确。再次感谢您的帮助。

为什么从EF 4.2 POCO中的数据库检索时,我的导航属性为空

您的连接方法可能没有数据,这有几个原因。要加载相关数据,您需要:

  • 显式加载数据
  • 满足延迟加载要求,或
  • 使用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)
    {
        //...
    }
}

你可以在这篇文章中阅读更多关于热切加载的内容。