代码之家  ›  专栏  ›  技术社区  ›  Eric J.

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

  •  6
  • Eric J.  · 技术社区  · 14 年前

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

    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
    {
    }
    

    (“givinInput”表示此处未显示的某些处理)

    我定义了一个 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 因为如此多的逻辑最终会出现在存储库中,而不是域对象中。

    再会之后,有一个问题:

    • 这个模式需要先使用ef4代码吗?
    • 有没有一种方法可以保留new()的用法,并且仍然首先使用EF 4/POCO/Code?
    • 在更高版本的CodeFirst支持中是否会取消此限制?

    有时想去POCO/ 我觉得 逆流而上,有时感觉 就像在尼亚加拉瀑布上游泳。不过,我还是想相信。。。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Rowan Miller    14 年前

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

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

    var cain=new Child();

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