entity-framework-4 - Entity Framework 4 Code First 和 new() 运算符

标签 entity-framework-4 poco code-first

我有一个相当深的对象层次结构,我试图用 Entity Framework 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
{
}

(“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/
    坚持无知路线感觉就像
    逆流而上,其他时候感觉
    就像在尼亚加拉瀑布游泳一样。尽管如此,我还是愿意相信……

    最佳答案

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

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

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

    var adam = myAdamRepository.GetAdam();

    var cain = new Child();

    adam.Children.Add(cain);

    ~罗文

    关于entity-framework-4 - Entity Framework 4 Code First 和 new() 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3033546/

    相关文章:

    c# - Entity Framework 4 - 删除对象

    entity-framework-4 - 我是否需要 .SaveChanges() 才能获得外键的 ID?

    c# - 使用 Entity Framework 时在同一数据库行程中获取总计数和页面行数

    c# - Entity Framework Code First 30+ 秒启动时间

    entity-framework - Entity Framework SET IDENTITY_INSERT

    c++ - 在 Objective C++ .mm 文件中包含 POCO 头文件会导致 Xcode 6 出现编译错误

    c++ - 没有 SSLManager 的 Poco SecureServerSocket

    c++ - osx - 构建 POCO 库时出现链接错误

    c# - Entity Framework : own ondelete action

    entity-framework - EF4 代码优先 : To Include or to not Include the Foreign Keys in the model when setting up an Association