Entity framework 4 Entity Framework 4代码优先和new()运算符

Entity framework 4 Entity Framework 4代码优先和new()运算符,entity-framework-4,poco,code-first,Entity Framework 4,Poco,Code First,我有一个相当深的对象层次结构,我试图先用实体框架4、POCO、PI(持久性无知)和代码来持久化这些对象。突然间,当我意识到不使用new()操作符时,事情开始很顺利了。正如最初编写的那样,这些对象经常使用new()创建子对象 取而代之的是,我使用存储库模式创建所有需要的子对象。例如,假设: class Adam { List<Child> children; void AddChildGivenInput(string input) { children.Add(new Chi

我有一个相当深的对象层次结构,我试图先用实体框架4、POCO、PI(持久性无知)和代码来持久化这些对象。突然间,当我意识到不使用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
{
}
现在,这已经足够有效了。然而,我不再“无知”我的持久性机制,因为我已经放弃了新的()操作符

此外,我还面临着失败的风险,因为太多的逻辑最终出现在存储库中,而不是域对象中

再会之后,有一个问题:

或者更确切地说是几个问题

  • 首先使用EF4代码是否需要此模式
  • 有没有一种方法可以保留new()的使用,并且仍然首先使用EF 4/POCO/Code
  • 是否有另一种模式将逻辑保留在域对象中,并且仍然首先使用EF 4/POCO/Code
  • 在以后版本的Code First support中是否会取消此限制
有时想去POCO/ 这条路感觉像 逆流而上,有时感觉很舒服
就像在尼亚加拉瀑布上游泳一样。尽管如此,我还是想相信……

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

在类中,您有一个用于children集合的字段和一个要添加到children集合的方法。EF通常(不仅仅是代码优先)当前要求集合作为属性进行表面处理,因此当前不支持此模式。提高我们与类交互的灵活性是EF的一个常见要求,我们的团队目前正在研究如何支持这一点

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

var adam=myAdamRepository.GetAdam()

var cain=new Child()

亚当。孩子们。加上(该隐)


~Rowan

欢迎来到堆栈溢出。基本问题是,我有一个很深的对象层次结构,每个层次都知道如何创建下一层次对象的实例。我的理解和经验是,我必须手动遍历对象层次结构,将所有对象单独附加到ObjectContext,然后才能持久化它们。我的应用程序相当复杂,但我将尝试将其提炼为一个简单、完整的示例。但今天不会发生,希望明天会发生。@Eric J,这不是我从Rowan的回答中理解的。对我来说,这听起来像是“如果您向相关对象的公共集合中添加了一些内容,那么即使您没有显式地将其添加到ObjectContext中,EF也会自动存储该实体”。这与LINQtoSQL的行为一致。
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(...)); 
    }
}