Сущность знает о его DbContext? - PullRequest
0 голосов
/ 30 апреля 2011

Я обнаружил некоторые ограничения в подходе класса 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 Ответ

3 голосов
/ 30 апреля 2011

Эта идея довольно сильно нарушает разделение интересов . Вы сделаете свою сущность зависимой от EF = вы будете связывать модель вашего домена с кодом доступа к данным. Если вы хотите использовать ORM, правильно подойдите к проблеме с помощью ORM. Если вам нужно количество подписчиков, у вас есть два варианта:

  • Загрузите подписчиков и используйте простую коллекцию Count - так поступает сущность
  • Запросить уровень доступа к данным для подсчета - это способ доступа к данным, осуществляемый уровнем доступа к данным

Смысл доменной модели заключается в работе с загруженными объектами, а не с запросом к базе данных, то есть в точке доступа к данным (репозитории, EF, объекты доступа к данным и т. Д.). Если вам нужно получить количество подписчиков, не загружая их, используйте:

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