Использование шаблона репозитория с Entity Framework (mvc storefront)
Может ли кто-нибудь помочь? Я смотрел видео для витрины MVC и создал свой собственный веб-сайт, используя эти методы, то есть DDD, шаблон репозитория, но я хочу использовать Entity Framework.
В интерфейсах возвращается IQueryable, но с Entity Framework следует возвращать ObjectQuery вместо этого? - Я буду использовать LINQ.
Также в примере с сохраненной версией он выглядит примерно так: IQueryable <Category> GetCategories();
Также в хранилище MVC класс Category был встроенным классом сущностей (стандартный класс), но с Entity Framework эти классы предварительно созданы в контексте объекта - не так ли?
Значит, мне нужно их построить?
Я немного смущен. Если у кого-нибудь есть полезный пример или код, это будет действительно полезно.
Как я уже сказал, я смотрел видео из магазина MVC с использованием linq2sql, но действительно хотел бы использовать Entity Framework.
Любые идеи?
Спасибо
Смити
Ответы
Ответ 1
Позвольте мне ответить на ваши вопросы по очереди:
Ваши репозитории должны возвращать IQueryable <T> , а не ObjectQuery. Причина в том, что вся цель шаблона репозитория - абстрагировать специфика вашего хранилища данных. Это позволяет вам делать что-то вроде замены поддельного репозитория, когда вы unit test своих контроллеров. Если вы сделаете репозиторий возвратом ObjectQuery, то вы не отвлеките Entity Framework. Другой способ сказать это, что пользователи вашего репозитория не должны, насколько это возможно, знать, что именно структура Entity Framework выполняет отображение O/R.
Чтобы использовать символы абзаца в тексте абзаца в разделе "Переполнение стека" больше, чем меньше, вы должны избегать их, как в HTML, т.е.
<
Вам не нужно делать это в кодовом блоке; в блоках кода вы просто набираете символ меньше или больше, чем символ.
Ответ 2
Возможно, если вы видите учебник Contact Manager на сайте http://www.asp.net/learn/mvc/#MVC_SampleApp, они используют шаблон репозитория и структуру сущностей.
Ответ 3
Я начал, как вы, несколько недель назад, вы увидите, что с EF довольно легко работать. Мой проект невелик, поэтому я использую сущности, сгенерированные EF, в качестве моих классов моделей, и вы можете добавить к ним свою собственную логику с использованием частичного класса.
Вот простой способ одного из моих репозиториев, например:
/// <summary>
/// Finds a user by it credentials
/// </summary>
/// <param name="oUser"></param>
/// <returns></returns>
public User FindByCredentials(string username, Byte[] password)
{
User user = null;
if (!Validators.IsStringEmptyOrNull(username))
{
user = this.FindByCredentialsQuery(username, password).FirstOrDefault<User>();
}
return (Validators.IsNull(user)) ? new User() : user;
}
/// <summary>
/// Finds a user by it credentials
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
protected IQueryable<User> FindByCredentialsQuery(string username, Byte[] password)
{
var query = from Users in this.UserDataContext.Users
where
(Users.Username == username) &&
(Users.Password == password) &&
(Users.Enabled == true)
select Users;
return query;
}
Обратите внимание, что я использую IQueryable только внутри репозитория и возвращаю только список запрошенных объектов. Таким образом, я могу контролировать, что запрос к БД всегда выполняется внутри Repo.
Ответ 4
Хороший общий репозиторий для инфраструктуры сущностей (активный):
http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx
В настоящее время я использую это как Application Framework (включаю полный репозиторий)
http://efmvc.codeplex.com/
PLS дать ему крик;)
Ответ 5
В новой серии учебников MVC представлен пример репозитория, который включает методы с параметрами, которые позволяют указывать фильтры, сортировки и т.д., не возвращая IQueryable:
http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
Ответ 6
Я не уверен, правильно ли это, но я использую L2E, перевод сгенерированных объектов в объекты домена с помощью AutoMapper 3rd инструмент стороны.