2

我对 EF 的循环依赖有点困惑,因为它似乎一切都将成为循环依赖。

这个教程

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }

    public virtual List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public virtual Blog Blog { get; set; }
}

当我在 Vs2012 中运行“代码映射”时,我确实看到它是一个循环引用

在此处输入图像描述

我不应该担心这个吗?我试图使用 Autofixture 生成虚拟数据,但由于循环引用而崩溃。

4

1 回答 1

3

我想这取决于你问谁你是否应该担心双向关联。在领域驱动设计中,人们通常会说你应该担心这一点。例如,Eric Evans 在他的《领域驱动设计》一书中说:解决软件核心的复杂性,你应该尽可能避免它们。

Julie Lerman 在最近的一篇文章中谈到了这个问题

在您提供的实体框架的简单示例中,如果您删除了 Post 上的 Blog 和 BlogId 属性,则不应有任何抱怨,但可能还有其他更复杂的情况。

默认情况下,实体将在数据库的 Posts 行中将外键添加到拥有的 Blogs 行,但域模型只能从 Blogs 导航到 Posts。

以下代码段将首先从数据库中加载第一个博客,然后延迟加载该博客的帖子。

using (var db = new BlogContext())
{
    var blog = db.Blogs.FirstOrDefault();

    //lazy loading the Posts of the blog that was fetched in previous line        
    foreach (var post in blog.Posts)
    {
        Trace.TraceInformation(string.Format("Title of post {0} is {1}",  post.Id, post.Title));
        }
    }
}

如果您真的需要从博客导航到帖子以及从帖子导航到博客,因为您的应用程序中有一些业务需求,那么您将不得不在查询和双向关联之间做出决定。选择哪一个完全取决于您,Entity Framework 两者都支持。

双向关联是指您在两侧都有导航属性,使您能够双向导航。即,如果 Blog 有一个 Posts 属性并且每个 Post 都有一个指向 Blog 的 Blog 属性,那么我们就有一个双向关联。

另一种选择是仅在一侧具有导航属性。例如,一个博客可能包含一个帖子列表,这可以很容易地从博客导航到帖子,这可能是最需要的。如果您在某些用例中有对帖子的引用并且需要找出它属于哪个博客,那么您可以通过在您的存储库/dbcontext 上进行查询来搜索在其列表中包含该帖子的博客对象来找到该博客的帖子。

DDD 的拥护者通常建议单向导航和查询是否需要反向导航。

于 2013-10-15T04:51:35.913 回答