В вашей модели содержатся классы, которые определяют разные объекты в вашем проекте. Это включает свойства с их основной информацией и методами для выполнения действий над этим объектом.
1) Вам действительно нужны запросы? Почему бы не использовать Entity Framework для этого? Создайте сопоставление для ваших доменных классов (либо корыто аннотаций или свободно API) и использовать DbContext
для извлечения и сохранение данных, хранящихся в базе данных
2) В идеале люди создают хранилища, впрыскивают в контроллеры (Dependency Injection) , Эти репозитории могут содержать, например, что-то вроде GetPersonById(int id)
. Внутри этого метода было бы две вещи:
- Выполните действие на объект домена
- сохранить его в
DbContext
Например:
public void Subscribe(int userID, Show show) {
var user = GetUserByID(userID);
if (!user.IsSubscribedTo(show.ShowID)) {
user.Subscribe(show);
_dbContext.SaveChanges();
}
}
Controller -> Метод call in repository -> Выполнить действие над соответствующим объектом домена -> Сохранить изменения в базе данных
Если вам нужно что-то, что не требует мутации объекта, это еще проще:
public User GetUserByID(int id) {
return _dbContext.Users.FirstOrDefault(x => x.ID == id);
}
3) Желоба хранилищ (см. Выше) Ваш DbContext
будет иметь группу DbSets
, которая содержит объекты, соответствующие каждой записи данных в вашей базе данных. Резервуары Trough вы можете работать с этими объектами и управлять ими. Когда вы вызываете метод DbContext.SaveChanges()
, он будет смотреть на то, что изменилось в этих списках и зафиксировать изменения в вашей базе данных.
Repository пример:
class User {
public int ID { get; set; }
public string Name { get; set; }
}
class DatabaseContext : DbContext {
public DbSet<User> Users { get; set; }
}
public interface IUserRepository {
User GetUserByID (int id);
bool UsernameExists (string name);
}
public class UserRepository : IUserRepository {
private DatabaseContext _db;
public UserRepository(DatabaseContext db){
_db = db;
}
public User GetUserByID(int id) {
return _db.Users.FirstOrDefault(x => x.ID == id);
}
public User GetUserByUsername(string username) {
return _db.Users.FirstOrDefault(x => x.Name == username);
}
}
public class UserController : Controller {
private IUserRepository _userRepository;
public UserController(IUserRepository userRepository) {
_userRepository = userRepository;
}
public ActionResult Details(int id){
return View(_userRepository.GetUserByID(id);
}
}
// Ninject settings (install this extension, you want it):
private void AddBindings(){
kernel.Bind<DatabaseContext>().ToSelf().InSingletonScope();
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();
}
Привет Я использую инфраструктуру Entity для доступа к содержимому базы данных. Я не знаю ничего о репозитории. Я слышал только о модели, просмотре и контроллере. И я знаю, что я могу использовать EF Dbcontext для извлечения данных из базы данных в контроллере и передать их для просмотра. Мне действительно нужно использовать репозиторий? Это трудная тема для изучения? Извините, это может быть немой вопрос, пожалуйста, не возражайте. – Dev
@Dev: Я добавил пример использования репозитория. Репозиторий - это не что иное, как класс, который вы используете для разделения фактических классов домена на уровне сохранения. Взгляните на него и сообщите мне, если что-то неясно. –
Я расскажу, что я понял. Пожалуйста, исправьте меня, если я ошибаюсь. 1) В основном мы создаем репозиторий внутри моделей с отдельным именем класса, например: myrepo- просто для лучшего понимания и структуры кода. 2) могу ли я написать все операции только в одном репозитории. Что я имею в виду, если мне нужно сделать одну операцию с таблицей 1 и другую операцию с таблицей 1 и таблицей2, другую с таблицей 3, я могу написать EF только в одном репо или мне нужно создать отдельное репо для каждой операции? – Dev