实体框架影响我的域名

时间:2013-11-13 14:48:36

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

我已经在系统上使用NHibernate一段时间了,我对它的工作原理感到非常满意,但我想我可以将NHibernate切换出来,并将实体框架纯粹用于学习练习。但是我遇到了一个问题,在我的域名中我有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时,这项工作的映射很好,我可以很愉快地遍历我的帖子评论之间的一对多关系,评论是按预期延迟加载的,一切都很好。

但是当转移到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如果强迫我更改我的域名,而且我的印象是域模型应该知道没有任何持久层。

所以我真的需要将这个额外的PostId字段添加到我的Comment类中以使关系起作用或我做错了吗?

我是否只是对那些受持久层变化影响的域迂腐?

没有像这样的Post和PostId字段意味着如果你改变PostId,你还必须在Comment类中处理更改以更新Post字段,反之亦然?

由于

CD

1 个答案:

答案 0 :(得分:0)

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