Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在存储库、通用存储库和;工作单位_Asp.net Mvc_Entity Framework_Repository_Entity Framework 6_Unit Of Work - Fatal编程技术网

Asp.net mvc 在存储库、通用存储库和;工作单位

Asp.net mvc 在存储库、通用存储库和;工作单位,asp.net-mvc,entity-framework,repository,entity-framework-6,unit-of-work,Asp.net Mvc,Entity Framework,Repository,Entity Framework 6,Unit Of Work,我正在开发asp.net mvc web应用程序&实体框架6。我希望在我的应用程序中包含以下内容:- 通用存储库类 每个实体类型的专用存储库类。此专用存储库将从通用存储库派生 有一个工作类单元,它将在专用存储库之间进行协调,因此存储库中的所有操作都将打包到单个数据库事务中 通用存储库是:- namespace SkillManagement.DAL { public class GenericRepository<TEntity> where TEntity : class

我正在开发asp.net mvc web应用程序&实体框架6。我希望在我的应用程序中包含以下内容:-

  • 通用存储库类

  • 每个实体类型的专用存储库类。此专用存储库将从通用存储库派生

  • 有一个工作类单元,它将在专用存储库之间进行协调,因此存储库中的所有操作都将打包到单个数据库事务中

  • 通用存储库是:-

    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...
    
    专用存储库之一:-

    namespace SkillManagement.DAL
    {
        public class SkillTypeRepository :  GenericRepository<SkillType> , ISkillTypeRepository ,IDisposable
        {
            private SkillManagementEntities db = new SkillManagementEntities();
            public SkillTypeRepository(SkillManagementEntities db)
                : base(db)
            {
    
            }
    
            public void Dispose()
            {
                db.Dispose();
    
            }
            public void Save()
            {
                db.SaveChanges();
            }
        }
    
    然后在我的控制器内,我将被称为工人阶级的联合体,如下所示:-

    public class SkillTypeController : Controller
       {
          private UnitOfWork unitOfWork = new UnitOfWork();
    
          //
          // GET: /Course/
    
          public ViewResult Index()
          {
             var skilltype = unitOfWork.SkillTypeRepository.Get();
             return View(courses.ToList());
          }
    
    因此,我的问题基本上是关于我是否在专用存储库>>通用存储库>>工作单元之间正确传递上下文对象。那么来自多个存储库的所有操作都将打包到一个db事务中


    有人能给我一些建议吗?

    我想只要删除
    私有的SkillManagementEntities db=new SkillManagementEntities()在所有存储库中就足够了


    您已经有了一个单独的上下文
    private SkillManagementEntities db=new SkillManagementEntities()是您的工作单元。只需将其传递给所有存储库,不要在任何存储库中创建新的上下文。

    EF6已经为您提供了所需的一切。为什么要在一个附加的、不必要的层中重新包装呢?我之前已经讨论过这个问题了。现在我知道EF充当存储库和工作单元。现在,我希望使用Repository不是为了实现简单的CRUD操作,而是能够跨控制器类重用代码,主要是为了重用具有连接多个表的复杂查询的方法。我将为每种实体类型创建多个回购,可能是一个回购。。为了能够在多个回购之间进行协调,我决定创建一个unite of work类,以便将所有回购操作包装在一个事务中。我知道EF可以作为CRUD操作的回购和unitofwork,但在我的例子中,我有一个复杂的数据访问层,我希望能够重用它……您需要的是一个服务层,而不是一个额外的重新存储层。例如,请参见,可能我们讨论的是同一件事,但名称不同,我试图实现的是不从控制器类调用DBContext对象。要从服务层或存储库执行此操作,请使用工作单元将服务层协调在一起。。。但我的问题是如何在两个对象之间传递名称db context object;抽象回购+专用回购+工作单元+控制器。您可以转告我吗?谢谢您的回复,但是如果我删除skillType Repo中的“private SkillManagementEntities db=new SkillManagementEntities();”,那么下面的“db.Dispose();”将不起作用。。。
    namespace SkillManagement.DAL
    {
        public class UnitOfWork : IDisposable
        {
            private SkillManagementEntities db = new SkillManagementEntities();
            private SkillTypeRepository skillTypeRepository;
            private Repository2 repository2;
            private Repository3 repository3;
            // code goes here....
    
    
            public SkillTypeRepository SkillTypeRepository
            {
                get
                {
    
                    if (this.skillTypeRepository == null)
                    {
                        this.skillTypeRepository = new SkillTypeRepository(db);
                    }
                    return skillTypeRepository;
                }
            }
    
           //code goes here for repository2 , repository3 , etc..
    
            public void Save()
            {
                db.SaveChanges();
            }
    
    public class SkillTypeController : Controller
       {
          private UnitOfWork unitOfWork = new UnitOfWork();
    
          //
          // GET: /Course/
    
          public ViewResult Index()
          {
             var skilltype = unitOfWork.SkillTypeRepository.Get();
             return View(courses.ToList());
          }