asp.net-mvc - 与存储库设计模式的交易

标签 asp.net-mvc c#-4.0 entity-framework-6 repository-pattern transactionscope

我使用 Entity Framework 6.0 和 Repository 设计模式开发了一个 ASP.NET MVC 应用程序来管理项目。现在我想集成事务以确保某些插入/更新数据库操作遵守 ACID 原则,尤其是原子性原则。

下面是我的通用存储库的片段:

<强>1。通用存储库接口(interface)

    public interface IGenericRepository<T> : IRepository  where T : BaseEntity
    {
        void Create(T entity);
        void Delete(T entity);
        IEnumerable<T> GetAll();
        void Update(T entity);
    }

<强>2。通用存储库类

public abstract class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity
        {
            protected IContext _context;
            protected IDbSet<T> _dbset;

            public GenericRepository(IContext context)
            {
                _context = context;
                _dbset = _context.Set<T>();
            }


            public virtual void Create(T entity)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity");
                }

                _dbset.Add(entity);
                _context.SaveChanges();
            }


            public virtual void Update(T entity)
            {
                if (entity == null) throw new ArgumentNullException("entity");
                _context.Entry(entity).State = System.Data.Entity.EntityState.Modified;
                _context.SaveChanges();
            }

            public virtual void Delete(T entity)
            {
                if (entity == null) throw new ArgumentNullException("entity");
                _dbset.Remove(entity);
                _context.SaveChanges();
            }

            public virtual IEnumerable<T> GetAll()
            {
                return _dbset.AsEnumerable<T>();
            }
        }

<强>3。我的 Icontext 实现

public interface IContext
    {
        IDbSet<Projet> Projects { get; set; }     
        IDbSet<Task> Tasks{ get; set; }
        IDbSet<Entite> Entities { get; set; }

        DbSet<TEntity> Set<TEntity>() where TEntity : class;
        DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;

        int SaveChanges();
    }

<强>4。项目实体

public class ProjectRepository : GenericRepository<Projet>, IProjectRepository
    {

        IContext _context;

        public ProjectRepository(IContext context) : base(context)
        {
            _context = context;
            _dbset = _context.Set<Projet>();
        }

        public Projet GetProjectById(int Id) 
        {
            return _dbset.FirstOrDefault(x=>x.Id == Id);
        }

    }

所以,我想做的是让交易与上面的模型一起工作。 例如,当使用他的任务创建项目时,我想使用事务来保存项目和任务实体,因此我确信插入这些实体将是一个原子操作。

感谢您的帮助和建议。

最佳答案

通常,您的存储库被注入(inject)到引擎/服务类中。我假设我们有一个 ProjectEngine.cs,其中注入(inject)了 ProjectRepo 和 TaskRepo。代码如下所示:

     public class ProjectEngine : IProjectEngine
        {
            IProjectRepository projectRepository;
            ITaskRepository taskRepository;

            public ProjectEngine(
                IProjectRepository ProjectRepository,
                ITaskRepository TaskRepository)
            {
                projectRepository = ProjectRepository;
                taskRepository = TaskRepository;
            }

            public void CreateProject(CreateProjectRequest createProjectRequest)
            {

            using (TransactionScope scope = new TransactionScope())
                    {

                       // these operations are atomic since they below to same transactionscope
                        projectRepository.Add([project]);
                        taskRepository.Add([tasks]);
                        // data will not be affected until complete operation is called. Any database exception would rollback the transaction.
                        scope.Complete();
                    }

              } 

         }

回顾一下,最好的方法是在同一事务范围内包含多个存储库操作。

关于asp.net-mvc - 与存储库设计模式的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43365118/

相关文章:

html - 如何将另一个目录中的 html 文件作为 ActionResult

asp.net-mvc - 自动将 FormsAuthentication 重定向到 Web.Config 中指定的其他 URL 吗?

c# - 在范围列表中搜索数字的最快方法

asp.net - 由于asp.net中对象的当前状态,因此操作无效。

c# - 在 Entity Framework 中映射自定义数据库值函数

sql-server-2012 - 带有 SQL Server 2012 的 Entity Framework 6 提供 System.Data.Entity.Core.ProviderIncompatibleException

javascript - Facebook 评论插件在创建评论时返回 500 错误

c# - EnableCors 属性未向 API 响应添加 Access-Control-Allow-Origin

c# - 分配 IEnumerable(协方差)

c# - 不是从 App.Config 获取连接字符串吗?