0

我使用MVC3 - 實體框架創建了一個項目。我喜歡與它一起使用Repository Pattern。我是新的存儲庫模式。是否需要爲每個模型類(表示數據庫中的每個表的類)創建ONE EACH存儲庫,並且在每個存儲庫中是否必須編寫所有將插入,更新,刪除和讀取記錄的功能如何在MVC3(實體框架)中創建存儲庫類?

回答

0

不,你不會。您可以爲所有類實現GenericRepository,然後在需要添加函數時覆蓋它。首先我要告訴你工作單元。通過這個類你可以訪問所有的存儲庫。我已經加入到這個例子中一個通用的,一個overrided:

public class UnitOfWork 
{ 
    FBDbContext context = new FBDbContext(); 

    public FBDbContext Context { get { return context; } } 

    private BlockRepository BlockRepository;   
    private GenericRepository<Category> CategoryRepository;      

    #region RepositoryClasses 
    public IBlockRepository blockRepository 
    { 
     get 
     { 
      if (this.BlockRepository == null) 
       this.BlockRepository = new BlockRepository(context); 
      return BlockRepository; 
     } 
    }   
    public IGenericRepository<Category> categoryRepository 
    { 
     get 
     { 
      if (this.CategoryRepository == null) 
       this.CategoryRepository = new GenericRepository<Category>(context); 
      return CategoryRepository; 
     } 
    }   
#endregion 

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

} 

然後你有通用的存儲庫:

public class GenericRepository<TEntity> 
{ 
    internal FBDbContext context; 
    internal DbSet<TEntity> dbSet; 

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

    public virtual TEntity Create() 
    { 
     return Activator.CreateInstance<TEntity>(); 
    } 

    public IQueryable<TEntity> GetAll() 
    { 
     return dbSet; 
    } 
    //And all the functions you want in all your model classes... 
} 

和一個例子,當你想取代通用庫:

public class BlockRepository : GenericRepository<Block> 
{ 
    public BlockRepository(FBDbContext context) : base(context) { } 

    public IEnumerable<Block> GetByCategory(Category category) 
    { 
     return context.Blocks.Where(r => r.CategoryId == category.Id); 
    }   
} 
0

您可以創建一個具有常用的方法的公共倉庫,所有其他存儲庫將是它的孩子們:

public class MyModelRepository : GenericRepository<MyModel> 
{ 
    // extend 
} 

var MyModelRepository = new MyModelRepository(); 

this,或谷歌爲「通用庫」 :)。如果你不需要爲一些模型庫擴展功能,那麼你甚至不能創建repository類,而不是做這樣的事情:

var MyModelRepository = new GenericRepository<MyModel>(); 
+0

我有像學生,部門,課程,講師等表和 模型類(Student.cs,Department.cs等)爲他們每個人在我的模型福爾德河 1.我需要像創建類 - IStuderntRepositor,StudentRepository, IDepartmentRepository,DepartmentRepository, ICourseRepository,CourseRepository, IInstructorRepository,IInstructorRepository等 2.什麼哪些插入,刪除,請選擇該功能,從每個表更新數據? 我是否必須在每個存儲庫中編寫這些函數? 例如函數InserStudent,GetStudentAndDepartment()? – user2215116

+0

@ user2215116不,我說,crud操作和基本功能將在通用資源庫中,並且您不必每次都寫入它們。 – karaxuna

+0

非常感謝karaxuna,我查看了您的帖子中的鏈接。我認爲作者沒有使用UnitOfWork。 UnitOfWork的作用是什麼?我應該在哪裏使用它? – user2215116

0

有一個代表各庫之間的共同操作的接口。即插入,更新,刪除和獲取:

public interface IRepository<T> 
    { 
     void Insert(T entity); 
     void Delete(T entity); 
     void Update(T entity); 
     void Fetch(T entity); 
    } 

public class Repository<T> : IRepository<T> 
    /// your implementation 
} 

然後在每一個模型,你可以定義庫,以適應環境中,例如:

var repository1 = new Repository<ModelType>(dataContext); 
    repository1.Insert(obj); 

    var repository2 = new Repository<DifferentModelType>(dataContext); 
    repository2.Fetch(objects); 

http://www.remondo.net/repository-pattern-example-csharp/