在我的 asp.net mvc web 应用程序中获取通用存储库 + 子存储库 + UnitOfWork
Getting Generic Repository + Child repository + UnitOfWork inside my asp.net mvc web application
我正在开发一个使用 Entity framework 6 的 asp.net vmc5 网络应用程序。
现在我正在努力让这些工作:-
定义通用存储库。
为每个 DBSet 类型创建一个专用存储库,该存储库将从通用存储库派生。
为每个专用存储库创建一个接口。
使用 UnitOfwork class 以便调用多个存储库 classes 将导致生成单个事务。
我有一个 DbSet
类型 SkillType
。
所以我创建了以下界面:-
namespace SkillManagementp.DAL
{
public interface ISkillTypeRepository {
}
然后是以下通用存储库:-
namespace SkillManagement.DAL
{
public class GenericRepository<TEntity> where TEntity : class
{
internal SkillManagementEntities context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SkillManagementEntities context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}//code goes here...
以下 SkillTypeRepository:-
namespace SkillManagement.DAL
{
public class SkillTypeRepository : GenericRepository<SkillType> : ISkillTypeRepository
{
private SkillManagementEntities db = new SkillManagementEntities();
public void Dispose()
{
db.Dispose();
}
public void Save()
{
db.SaveChanges();
}
}
}
最后我创建了以下 UnitOfWork class:-
namespace SkillManagement.DAL
{
public class UnitOfWork : IDisposable
{
private SkillManagementEntities db = new SkillManagementEntities();
private SkillTypeRepository skillTypeRepository;
public SkillTypeRepository SkillTypeRepository
{
get
{
if (this.skillTypeRepository == null)
{
this.skillTypeRepository = new SkillTypeRepository();
}
return skillTypeRepository;
}
}
public void Save()
{
db.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
但是我收到了这些错误:-
我无法为我的 SkillManagmentRepositry class.
定义两个派生的 classes
此外,我在 SkillTypeRepository 中收到此错误:- SkillManagement.DAL.GenericRepository' 不包含采用 0 个参数的构造函数
将SkillTypeRepository
重写为:
public class SkillTypeRepository : GenericRepository<SkillType>, ISkillTypeRepository
{
public SkillTypeRepository() : base(new SkillManagementEntities())
{
}
//rest of code etc
}
如我的评论所述,您的 SkillTypeRepository
没有构造函数,但 GenericRepository
有,因为基础 class 有一个构造函数,您需要在派生 class 并调用 :base(params)
有关详细信息,请参阅 here。
然后您可以简单地调用 base.context
来获取对 SkillManagementEntities
的引用。
我正在开发一个使用 Entity framework 6 的 asp.net vmc5 网络应用程序。 现在我正在努力让这些工作:-
定义通用存储库。
为每个 DBSet 类型创建一个专用存储库,该存储库将从通用存储库派生。
为每个专用存储库创建一个接口。
使用 UnitOfwork class 以便调用多个存储库 classes 将导致生成单个事务。
我有一个 DbSet
类型 SkillType
。
所以我创建了以下界面:-
namespace SkillManagementp.DAL
{
public interface ISkillTypeRepository {
}
然后是以下通用存储库:-
namespace SkillManagement.DAL
{
public class GenericRepository<TEntity> where TEntity : class
{
internal SkillManagementEntities context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SkillManagementEntities context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}//code goes here...
以下 SkillTypeRepository:-
namespace SkillManagement.DAL
{
public class SkillTypeRepository : GenericRepository<SkillType> : ISkillTypeRepository
{
private SkillManagementEntities db = new SkillManagementEntities();
public void Dispose()
{
db.Dispose();
}
public void Save()
{
db.SaveChanges();
}
}
}
最后我创建了以下 UnitOfWork class:-
namespace SkillManagement.DAL
{
public class UnitOfWork : IDisposable
{
private SkillManagementEntities db = new SkillManagementEntities();
private SkillTypeRepository skillTypeRepository;
public SkillTypeRepository SkillTypeRepository
{
get
{
if (this.skillTypeRepository == null)
{
this.skillTypeRepository = new SkillTypeRepository();
}
return skillTypeRepository;
}
}
public void Save()
{
db.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
但是我收到了这些错误:-
我无法为我的 SkillManagmentRepositry class.
定义两个派生的 classes
此外,我在 SkillTypeRepository 中收到此错误:- SkillManagement.DAL.GenericRepository' 不包含采用 0 个参数的构造函数
将SkillTypeRepository
重写为:
public class SkillTypeRepository : GenericRepository<SkillType>, ISkillTypeRepository
{
public SkillTypeRepository() : base(new SkillManagementEntities())
{
}
//rest of code etc
}
如我的评论所述,您的 SkillTypeRepository
没有构造函数,但 GenericRepository
有,因为基础 class 有一个构造函数,您需要在派生 class 并调用 :base(params)
有关详细信息,请参阅 here。
然后您可以简单地调用 base.context
来获取对 SkillManagementEntities
的引用。