【问题标题】:EF4 POCO one to many Navigation property is nullEF4 POCO 一对多导航属性为空
【发布时间】:2011-01-01 12:58:40
【问题描述】:

我使用的是 VS2010,EF4 功能 CTP(最新版本)和 POCO 对象,例如下面的示例:

class Person
{
 public int ID { get; set; }
 public string Name { get; set; }
 public virtual IList<Account> Accounts { get; set; }
 ...
}

class Account
{
 public string Number { get; set; }
 public int ID { get; set; }
 ...
}

为简洁起见,假设下面的 context 是 EF4 的上下文对象。我在实体类型和数据库之间有一个 dbml 映射,我像这样使用它没有问题:

Person doug = context.Persons.CreateObject();
doug.Name = "Doug";    
context.Add(doug);
context.Save();
doug.Accounts.Add(new Account() { Name = "foo" });
context.Save(); // two calls needed, yuck

此时,数据库有一个名为“Doug”的个人记录和一个帐户记录“foo”。我可以查询并找回那些记录就好了。但是,如果我尝试在保存人员之前添加帐户,则帐户列表为空(代理尚未在该属性上创建实例)。请参阅下一个示例:

Person doug = context.Persons.CreateObject();
doug.Name = "Doug";
doug.Accounts.Add(new Account() { Name = "foo" }); // throws null reference exception
context.Add(doug);
context.Save();

有没有其他人遇到过这种情况?更好的是,有没有人找到好的解决方案?

【问题讨论】:

    标签: entity-framework poco entity-framework-4 navigation-properties


    【解决方案1】:
    Person doug = context.Persons.CreateObject();
    
    doug.Name = "Doug";
    
    context.Add(doug);
    doug.Accounts.Add(new Account() { Name = "foo" });
    context.Save();
    

    这会起作用

    【讨论】:

      【解决方案2】:

      是的,是的!

      当您新建 POCO(而不是从上下文中创建对象)时,不会为您提供任何代理。这似乎很明显,但在追查类似问题时,我必须明确提醒自己这种行为。 (我知道这不是您在问题中描述的情况,但应该承认整个问题)。

      根据我在自己的测试中观察到的情况,在 POCO 的构造函数中初始化集合不会干扰正确的 EF4 代理延迟加载行为。

      好的,说了这么多,我现在看到你对上一个答案的评论——当我从我的上下文中请求一个新的人时,为什么我没有一个代理的地址集合?您是否在上下文中启用了延迟加载?看到我们如何处理导航属性,我可以看到在这种情况下关闭延迟加载可能会有所不同。

      【讨论】:

        【解决方案3】:

        ISTM 认为,如果您希望框架为您完成所有这些工作,那么您就不会真正拥有“POCO”,对吗?使用上面的代码参加您的 Person 课程。如果不涉及 EF,您希望 Accounts 属性在构造之后的状态,没有构造函数?在我看来,CLR 将保证它们为空。

        是的,代理可以在必要时初始化它以实现 DB 值,但在 EF 中,“POCO”实际上意味着“Plain”。不是“我们假装是'普通'的运行时生成的代码”。

        【讨论】:

        • 我已经编辑了我的问题以澄清我不是在询问构造函数场景,而是context.Persons.CreateObject(); 行为。我的困惑是,如果框架在我保存对象后要“拥有”这些导航属性,为什么它在创建实体实例时不这样做呢?我将集合初始化放在我的实体的构造函数中没有问题,但如果框架期望这些集合为null,我似乎将对象置于错误状态。
        猜你喜欢
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2014-10-15
        相关资源
        最近更新 更多