2013-07-10 2 views
1

Я узнал о MVC, и я использую Entity Framework. То, что я пытаюсь понять, - это хранилища. Каждый учебник, который я прочитал, касается одного объекта, и на этом уровне у меня есть понимание, но что касается нескольких таблиц. Я использую вариант кода - сначала, где я сопоставляю классы модели с существующей базой данных. В моей базе данных есть три таблицы; Пользователь, Journey и UserJourney (связанная таблица). Пользователь и путешествие имеют отношения «многие ко многим». Должен ли я иметь репозиторий для каждого объекта? Используются ли здесь агрегаты? В конечном итоге я хочу запросить базу данных, чтобы найти поездки пользователя и перейти к представлению.Должен ли я определить репозиторий для каждого объекта

Мой вопрос, пожалуй, расплывчатый, но я совершенно смущен по этому поводу, поэтому любая помощь в понимании этого будет оценена по достоинству!

ответ

1

Обычно репозитории не должны определяться для каждой сущности, а не для aggregate root. У вас есть объекты, которые не могут жить сами по себе, но связаны с каким-либо родительским объектом. Этот родительский объект называется агрегированным корнем, и у вас должен быть репозиторий для каждого из них.

+0

Хорошо, у меня есть пользовательские и Journey таблицы, которые имеют отношения многие ко многим. Итак, теперь у меня также есть связанная таблица UserJourney. Стали бы эти три таблицы составлять совокупность? Каким будет совокупный корень? Я предполагаю, что пользователь. –

1

Поиск концепции GenericRepository. Это поможет избавиться от репозитория для каждой проблемы с сущностью. Пример ниже:

public interface IGenericRepository<T> where T : class 
{ 
    IEnumerable<T> GetAll(); 
    T SingleOrDefault(Expression<Func<T, bool>> predicate); 
    IEnumerable<T> Get(Expression<Func<T, bool>> predicate); 
    void Insert(T entity); 
    void Update(T entity); 
    void Delete(object id); 
    void Delete(T entity); 
} 

public class GenericRepository<T> : IGenericRepository<T> where T : class 
{ 
    readonly MyDbContext _context; 
    readonly DbSet<T> _dbSet; 
    public GenericRepository(PfsDbContext context) 
    { 
     _context = context; 
     _dbSet = context.Set<T>(); 
    } 

    public virtual IEnumerable<T> GetAll() 
    { 
     return _dbSet.AsEnumerable(); 
    } 

    public T SingleOrDefault(Expression<Func<T, bool>> predicate) 
    { 
     return _dbSet.Where(predicate).SingleOrDefault(); 
    } 

    public IEnumerable<T> Get(Expression<Func<T, bool>> predicate) 
    { 
     return _dbSet.Where(predicate); 
    } 

    public void Insert(T entity) 
    { 
     _dbSet.Add(entity); 
    } 

    public void Update(T entityToUpdate) 
    { 
     _dbSet.Attach(entityToUpdate); 
     _context.Entry(entityToUpdate).State = EntityState.Modified; 
    } 

    public void Delete(T entity) 
    { 
     if (_context.Entry(entity).State == EntityState.Detached) 
     { 
      _dbSet.Attach(entity); 
     } 
     _dbSet.Remove(entity); 
    } 

    public void Delete(object id) 
    { 
     var entityToDelete = _dbSet.Find(id); 
     Delete(entityToDelete); 
    } 
    } 

Вы можете использовать его в качестве

var userRepository = new GenericRepository<User>(_context); 
var journeyRepository = new GenericRepository<Journey>(_context); 
Смежные вопросы