【问题标题】:Entity Framework affecting my domain影响我的域的实体框架
【发布时间】:2013-11-13 14:48:35
【问题描述】:

我在系统上使用 NHibernate 已经有一段时间了,我对它的工作方式非常满意,但我想我会尝试将 NHibernate 换掉并放入 Entity Framework 纯粹用于学习练习。但是,我遇到了一个问题,在我的域中,我有 2 个类(对于示例进行了一些简化)

public class Post
{
    public Post()
    {
        Comments = new List<Comment>();
    }

    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string Text { get; set; }
    public virtual DateTime DatePosted { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
}

public class Comment
{
    public virtual int Id { get; set; }
    public virtual string CommentText { get; set; }
    public virtual Post Post { get; set; }
}

当我使用 NHibernate 时,此映射工作正常,我可以很高兴地在我的 Post Comment 一对多关系之间遍历,评论按预期延迟加载,一切都很好。

但是当转移到 EntityFramework 时,似乎为了使关系起作用,我需要更改我的 Comment 类以包含 PostId 字段以及 Post 对象,以便获得这样的关系。

public class Comment
{
    public virtual int Id { get; set; }
    public virtual string CommentText { get; set; }
    public virtual int PostId { get; set; } // added in for entityframework
    public virtual Post Post { get; set; }
    public virtual int UserId { get; set; }
}

将此字段添加到我的域对象中后,映射现在似乎可以工作,但我对此感到有些不安,因为如果强迫我更改我的域,感觉就像 Entityframework,我的印象是域模型应该知道没有持久层。

那么我真的需要在我的 Comment 类中添加这个额外的 PostId 字段来使关系正常工作还是我做错了什么?

我只是对受持久层变化影响的域持迂腐态度吗?

没有像这样将 Post 和 PostId 字段放在一起是否意味着如果说您更改 PostId,您还必须处理更改以更新 Comment 类中的 Post 字段,反之亦然?

谢谢

光盘

【问题讨论】:

  • 在 EF 中生成数据模型时,您可以取消选中“在模型中包含外键列”但是从内存中这意味着 EF 可能必须去数据库获取 Comment.Post。 Id 而在 NH 则没有
  • 我没有使用生成数据模型,我的域已经构建,因为它之前通过 NHibernate 与现有数据库一起使用,我继承了 DbContext 类并添加了我可能需要的任何映射覆盖OnModelCreating 方法。
  • Post 本身不是聚合根有什么原因吗? Post 是否对其 cmets 强制执行任何不变量?
  • Post / Comment 只是我选择的一个例子,它可能很容易是 Order / OrderLineItem,我想要达到的目的是,我是否需要 OrderLineItem 类中的 Order 和 OrderId因为它可以与实体框架一起使用,而不是 NHibernate 如何允许我在没有额外 OrderId 字段的情况下只在 OrderLineItem 类中拥有 Order 属性,但这是我目前的理解。
  • 几分钟前我发现了这篇文章,它似乎很好地解释了这一切,ladislavmrnka.com/2011/05/…

标签: c# entity-framework nhibernate domain-driven-design


【解决方案1】:

在我看来,这是 Entity Framework 的主要缺陷之一。您可以在不添加外键的情况下使 EF 工作,但是您的应用程序必须从数据库中检索实体才能设置属性,因为 EF 没有与 NHibernate 的 ISession.Load 方法等效的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多