2014-02-08 6 views
3

Я пытаюсь реализовать Unit of Work в своем проекте и задать некоторые быстрые вопросы. Я использую класс, показанный by this tutorial:Расширение Единицы работы Entity Framework

Так что, когда я его реализую и допустим, я делаю класс Users GenericRepository. Что делать, если есть некоторые элементы, которые я хочу добавить в класс Users, но не входит в состав GenericRepository.

Как создать другой интерфейс и использовать некоторый тип наследования, поэтому я все еще получаю материал от GenericRepository вместе с новыми функциями, которые я хотел.

Я в основном хочу его продлить.

public interface ICategoryRepository : IGenericRepository<Category> 
{ 
    IEnumerable<LocalComicCategoriesModel> GetCategories(); 
    IEnumerable<LocalComicCategoriesModel> GetCategoriesByComicID(int comicid, bool appendCategories); 
} 

public class CategoryRepository : GenericRepository<Category>, ICategoryRepository 
{ 
    new ComicEntities context; 

    public CategoryRepository(ComicEntities context) : base(context) 
    { 
     this.context = context; 

    } 

    public IEnumerable<LocalComicCategoriesModel> GetCategories() 
    { 
     return context.Categorys.Select(i => new LocalComicCategoriesModel { Id = i.Category_Id, Title = i.Name }); 
    } 

    public IEnumerable<LocalComicCategoriesModel> GetCategoriesByComicID(int comicid, bool appendCategories) 
    { 
     if (appendCategories == true) 
     { 
      IEnumerable<LocalComicCategoriesModel> query = from tbcat in context.Categorys 
                  join tbitem_cat in context.ComicCategorys.Where(i => i.Comic_Id == comicid) 
                  on tbcat.Category_Id equals tbitem_cat.Category_Id into ct 
                  from tbitem_cat in ct.DefaultIfEmpty() 
                  select new LocalComicCategoriesModel 
                  { 
                   Id = tbcat.Category_Id, 
                   Title = tbcat.Name, 
                   isChecked = tbitem_cat == null ? false : true 
                  }; 

      return query; 
     } 
     else 
     { 
      IEnumerable<LocalComicCategoriesModel> returnedCategories = from t in context.Categorys 
                     join v in context.ComicCategorys on t.Category_Id equals v.Category_Id 
                     where v.Comic_Id == comicid 
                     select new LocalComicCategoriesModel 
                     { 
                      Id = v.Category_Id, 
                      isChecked = true, 
                      Title = t.Name 
                     }; 

      return returnedCategories; 
     } 
    } 
} 

На что я получаю эту ошибку:

'Comics.Models.Category' cannot be used as type parameter 'TEntity' in the generic type or method 'Comics.DAL.Interfaces.GenericRepository<TEntity>'. There is no implicit reference conversion from 'Comics.Models.Category' to 'Comics.DAL.Interfaces.IGenericRepository<Comics.Models.Category>'. 

ответ

3

позволяет сказать, что для вас есть/универсальный интерфейс хранилища базы, которая выглядит, как этот

public interface IRepository<T> where T : class 
{ 
    IQueryable<T> All(); 
    IQueryable<T> Find(Expression<Func<T, bool>> predicate);   
    T GetById(int id); 

    // and the rest of your methods 
} 

Если у вас есть «нормальный» класс, на котором вы хотели реализовать этот общий репозиторий, вы можете сделать это как

IRepository<MyClass> MyClassRepository

Теперь, для классов, которые нуждаются в дополнительной функциональности (например, ваш User класса), вы сделаете дополнительный репозиторий следующим образом:

public interface IUserRepository : IRepository<User> 
    { 
     IQueryable<User> AllAuthorized(); 
     IQueryable<User> AllConfirmed(); 
    } 

Затем, чтобы использовать его, наследуйте от вашего общего хранилища и он реализовать свой IUserRepository интерфейс.

public class UserRepository : Repository<User>, IUserRepository 
    {  
     public IQueryable<User> AllAuthorized() 
     { 
      // implement here 
     } 

     public IQueryable<User> AllConfirmed() 
     { 
      // implement here 
     } 
    } 

Теперь вместо инстанцировании IRepository<User>, вы будете просто использовать IUserRepository

+0

Nevermind, жаль об этом. –

+0

Если у вас нет базового репозитория, вам необходимо реализовать все методы в обоих репозиториях. Может быть, именно поэтому вы получаете исключение? –

+0

@ImranRashid Вот последняя ошибка, которую я получаю: '' Comics.Models.Category 'не может использоваться как параметр типа' TEntity 'в родовом типе или методе' Comics.DAL.Interfaces.GenericRepository '. Нет никакого неявного преобразования ссылок из «Comics.Models.Category» в «Comics.DAL.Interfaces.GenericRepository ». ' Я разместил свой код. –

Смежные вопросы