实体知道他的DbContext?

时间:2011-04-30 18:48:40

标签: c# .net ef-code-first entity-framework-4.1

我在实体框架中发现了POCO类方法的一些限制,因为实体不能在不保存DbContext引用的情况下自行处理相关查询。我猜代理人私下提到它,我们无法访问它。我想要达到的目标是在模型下面保持追随者,但如果我需要追随者数而不是追随者,所以我不能通过模型​​来做到这一点,因为模型没有上下文的参考。因此,解决方案是将FollowersCount保留在模型上的映射属性,并在存储库中对其执行查询然后进行设置。这看起来像创建DTO对象而不创建新的DTO。

第二种方法可以在模型属性中显式地再次保持DbContext引用,因为没有映射,然后执行相关的查询。

这两种方法的缺点是手动重复设置每个获取模型中的值。您认为这两种解决方案是什么?有更好的方法吗?

public class Post : Entity
{
    public string Title { get; set; }
    [NotMapped]
    public DbContext Context { get; set; }
    public virtual List<User> Followers{ get; set; }
    public virtual FollowersCount()
    {
        return //use DbContext and just execute query for count of Followers
    }
}

1 个答案:

答案 0 :(得分:3)

这个想法严重破坏了separation of concerns。您将使您的实体依赖于EF =您将使用数据访问代码弄乱您的域模型。如果要使用ORM正确地以ORM方式解决问题。如果您需要关注者的数量,您有两个选择:

  • 加载关注者并使用简单集合Count - 这是由实体完成的doamin方式
  • 要求数据访问层进行计数 - 这是数据访问层完成的数据访问方式

域模型的要点是处理加载的对象而不是查询数据库,即数据访问层(存储库,EF,数据访问对象等)。如果您需要在不加载它们的情况下计算关注者数量,请使用:

int count = context.Entry(post)
                   .Collection(p => p.Followers)
                   .Query()
                   .Count();