Создание репозитория с использованием Entity Framework Code First 4.3 - PullRequest
5 голосов
/ 13 марта 2012

Некоторое время назад я создал репозитории и сервисы, используя linq to sql, и я изо всех сил пытался это понять. Я наконец понял это, но сейчас я пытаюсь сделать то же самое, но с использованием Code First EF. Я запутался, как это работает с кодом в первую очередь. Если у меня есть один репозиторий, который я могу просто передать в объект класса и выбрать select (), т. Д. ... Как это взаимодействует или как я могу подключить это к / a DbContext? Если кто-то может указать мне правильное направление или дать какой-то совет, это будет оценено. Не так много на этом материале в Google, так как это относительно новый шаблон.

Как использовать / я бы использовал DbSet? Эти репозитории классные, но запутанные.

   public class IRepository<T> : IDisposable
        where T : class, new()
{
    IQueryable<T> Select();

    IQueryable<T> SelectWith(params Expression<Func<T, object>>[] includeProperties);

    T GetById(int id);

    T GetByIdWith(int id, params Expression<Func<T, object>>[] includeProperties);

    void InsertOnCommit(T model);

    void DeleteOnCommit(T model);

}


public class DataContext : DbContext
{
}

1 Ответ

6 голосов
/ 13 марта 2012

Вот учебник для репозитория и UnitOfWork в EF из ASP.Net .Надеюсь, это поможет.( UnitOfWork должен гарантировать, что несколько репозиториев совместно используют один и тот же DataContext )

Общий репозиторий :

   public class GenericRepository<TEntity> where TEntity : class 
    { 
        internal SchoolDBContext context; 
        internal DbSet<TEntity> dbSet; 

        public GenericRepository(SchoolDBContext context) 
        { 
            this.context = context; 
            this.dbSet = context.Set<TEntity>(); 
        } 

        public virtual IEnumerable<TEntity> Get( 
          Expression<Func<TEntity, bool>> filter = null, 
          Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
          string includeProperties = "") 
        {
        ...
        }

        public virtual TEntity GetByID(object id) 
        { 
           return dbSet.Find(id); 
        }

        public virtual void Insert(TEntity entity) 
        { 
          dbSet.Add(entity); 
        } 

      ...
     }

UnitOfWork : Вызов метода Save () для обновления всех ваших изменений в репозиториях.

public class UnitOfWork : IDisposable 
{ 
    private SchoolDBContext context = new SchoolDBContext(); 
    private GenericRepository<Department> departmentRepository; 

    public GenericRepository<Department> DepartmentRepository 
    { 
        get 
        { 

            if (this.departmentRepository == null) 
            { 
                this.departmentRepository = new GenericRepository<Department>(context); 
            } 
            return departmentRepository; 
        } 
    }

    public void Save() 
    { 
        context.SaveChanges(); 
    }
    ....
 }

Контроллер :

 public class CourseController : Controller 
 { 
     private UnitOfWork unitOfWork = new UnitOfWork(); 

     // 
     // GET: /Course/ 

     public ViewResult Index() 
     { 
         var courses = unitOfWork.CourseRepository.Get(includeProperties: "Department"); 
         return View(courses.ToList()); 
    }

    ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...