【问题标题】:Entity Framework 4 Code First and the new() OperatorEntity Framework 4 Code First 和 new() 运算符
【发布时间】:2011-03-03 06:58:12
【问题描述】:

我有一个相当深的对象层次结构,我试图通过 Entity Framework 4、POCO、PI(Persistence Ignorance)和 Code First 进行持久化。突然间,当我意识到不使用 new() 操作符时,事情开始运转良好。正如最初所写的那样,对象经常使用 new() 来创建子对象。

相反,我使用我对存储库模式的看法来根据需要创建所有子对象。例如,给定:

class Adam
{
  List<Child> children;
  void AddChildGivenInput(string input) { children.Add(new Child(...)); }
}

class Child
{
  List<GrandChild> grandchildren;
  void AddGrandChildGivenInput(string input) { grandchildren.Add(new GrandChild(...)); }
}

class GrandChild
{
}

(“GivenInput”暗示此处未显示一些处理)

我定义了一个AdamRepository,比如:

class AdamRepository
{
    Adam Add() 
    { 
        return objectContext.Create<Adam>(); 
    }
    Child AddChildGivenInput(Adam adam, string input) 
    { 
        return adam.children.Add(new Child(...)); 
    }
    GrandChild AddGrandchildGivenInput(Child child, string input) 
    { 
        return child.grandchildren.Add(new GrandChild(...)); 
    }
}

现在,这已经足够好了。但是,我不再“不了解”我的持久性机制,因为我已经放弃了 new() 运算符。

此外,我面临anemic domain model 的风险,因为太多逻辑最终都在存储库中,而不是在域对象中。

再见后,一个问题:

或者说几个问题……

  • 此模式是否需要使用 EF 4 Code First?
  • 有没有办法在保留使用 new() 的同时仍然使用 EF 4/POCO/Code First?
  • 是否有另一种模式可以将逻辑留在域对象中,并且仍然可以使用 EF 4 / POCO / Code First?
  • 是否会在更高版本的 Code First 支持中取消此限制?

有时试图去 POCO / 坚持无知路线感觉就像 逆流而上,其他时候感觉 就像在尼亚加拉瀑布游泳一样。尽管如此,我还是愿意相信……

【问题讨论】:

    标签: entity-framework-4 poco code-first


    【解决方案1】:

    以下几点可能有助于回答您的问题:

    在您的类中,您有一个用于子集合的字段和一个添加到子集合的方法。一般来说,EF(不仅仅是 Code First)目前要求集合作为属性是表面的,因此目前不支持这种模式。 EF 的常见要求是在我们如何与类交互方面具有更大的灵活性,我们的团队目前正在研究如何支持这一点

    您提到您需要在上下文中显式注册实体,但不一定如此。在下面的示例中,如果 GetAdam() 返回附加到底层上下文的 Adam 对象,那么当您保存并插入数据库时​​,EF 将自动发现新的子 Cain。

    var adam = myAdamRepository.GetAdam();

    var cain = new Child();

    adam.Children.Add(cain);

    ~罗文

    【讨论】:

    • 欢迎来到 Stack Overflow。根本问题是我确实有一个很深的对象层次结构,其中每个级别都知道如何创建下一级对象的实例。我的理解和经验是,我必须手动遍历我的对象层次结构以将所有对象单独附加到 ObjectContext 之前,它们才能被持久化。我的应用程序非常复杂,但我会尝试将其提炼成一个简单、完整的示例。不过今天不会发生,希望明天发生。
    • @Eric J,这不是我对罗文的回答所理解的。对我来说,这听起来像是“如果你向相关对象的公共集合中添加一些东西,那么即使你没有明确地将它添加到 ObjectContext 中,EF 也会自动存储该实体”。这与 LINQ to SQL 的行为一致。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多