2011-02-23 59 views
1

如果我们手动构建我们的关联,我们将不得不在我们的域模型中公开外键?DDD和实体框架 - 手动建立关联

例如,如果我检索所有产品和所有类别,我可以手动构建Product.Categories属性的唯一方法是如果我在模型中公开ProductCategory映射吗?

我宁可不这样做,如果有替代方案(请注意,通过EF急切加载不是一个选项,因为我有两个许多关联加载)。

+0

你打算如何公开这些关联? – CarneyCode 2011-02-23 17:53:58

+0

这些关联仍然存在,它们不会被EF加载。默认情况下,没有必要公开映射表,但我认为可能需要手动加载关联。 – 2011-02-23 22:00:20

回答

0

解决方案是使用Linq投影来检索相关的键。

var tags = (from p in postRepo.GetAll() 
     from t in p.Tags 
     select new 
     { 
      PostId = p.Id, 
      Tag = t 
     }).Take(1000).ToList(); 

我将上述查询的结果粘贴到List<KeyValuePair<Guid, Tag>>中,然后将其缓存。当我加载一篇文章时,我可以从缓存中手动构建它的“标签”集合。

这是我们现在不得不采取的一种方法。虽然延迟加载非常方便,恕我直言,它不应该与您的意见。

通过使用上述方法缓存常见关联,我们能够将先前发出59个查询(由于延迟加载)的页面减少为6个查询。

0

您可以在项目中添加一个部分类“Product”,并使用IEnumerable<Category>属性“Categories”(甚至返回IEnumerable<Category>的方法)扩展您的“Product”实体。

这样你就可以自己实现“Categories”的检索。

+0

我不需要这样做。产品已具有类别属性。我的观点(和问题)是,是否需要在我的域模型中公开外键/映射表以便手动加载关联属性,我认为答案可能是肯定的。 – 2011-02-23 22:01:52