WPF实战学习笔记09-创建工作单元

创建工作单元

添加包

  • Microsoft.EntityFrameworkCore.AutoHistory

    A plugin for Microsoft.EntityFrameworkCore to support automatically recording data changes history.

  • Microsoft.EntityFrameworkCore.UnitOfWork

    A plugin for Microsoft.EntityFrameworkCore to support repository, unit of work patterns, and multiple database with distributed transaction supported.

依赖注入

添加命名空间using Arch.EntityFrameworkCore.UnitOfWork;

添加仓储段

添加文件

  • webapi工程

./Repository/MemoRepository.cs

./Repository/ToDoRepository.cs

./Repository/UserRepository.cs

实现仓储段接口

注意要继承Repository, IRepository两个以及接口

MemoRepository.cs
c# 复制代码
using Arch.EntityFrameworkCore.UnitOfWork;
using Arch.EntityFrameworkCore.UnitOfWork.Collections;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Query;
using MyToDo.Api.Context;
using System.Linq.Expressions;

namespace MyToDo.Api.Repository
{
    public class MemoRepository : Repository<MyTodoContext>, IRepository<Memo>
    {
        public MemoRepository(MyTodoContext dbContext) : base(dbContext)
        {
        }

        public int Count(Expression<Func<Memo, bool>> predicate = null)
        {
            throw new NotImplementedException();
        }

        public void Delete(Memo entity)
        {
            throw new NotImplementedException();
        }

        public void Delete(params Memo[] entities)
        {
            throw new NotImplementedException();
        }

        public void Delete(IEnumerable<Memo> entities)
        {
            throw new NotImplementedException();
        }

        public Memo GetFirstOrDefault(Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public TResult GetFirstOrDefault<TResult>(Expression<Func<Memo, TResult>> selector, Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public Task<TResult> GetFirstOrDefaultAsync<TResult>(Expression<Func<Memo, TResult>> selector, Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public Task<Memo> GetFirstOrDefaultAsync(Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public IPagedList<Memo> GetPagedList(Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public IPagedList<TResult> GetPagedList<TResult>(Expression<Func<Memo, TResult>> selector, Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, bool ignoreQueryFilters = false) where TResult : class
        {
            throw new NotImplementedException();
        }

        public Task<IPagedList<Memo>> GetPagedListAsync(Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, CancellationToken cancellationToken = default, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public Task<IPagedList<TResult>> GetPagedListAsync<TResult>(Expression<Func<Memo, TResult>> selector, Expression<Func<Memo, bool>> predicate = null, Func<IQueryable<Memo>, IOrderedQueryable<Memo>> orderBy = null, Func<IQueryable<Memo>, IIncludableQueryable<Memo, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, CancellationToken cancellationToken = default, bool ignoreQueryFilters = false) where TResult : class
        {
            throw new NotImplementedException();
        }

        public void Insert(Memo entity)
        {
            throw new NotImplementedException();
        }

        public void Insert(params Memo[] entities)
        {
            throw new NotImplementedException();
        }

        public void Insert(IEnumerable<Memo> entities)
        {
            throw new NotImplementedException();
        }

        public ValueTask<EntityEntry<Memo>> InsertAsync(Memo entity, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }

        public Task InsertAsync(params Memo[] entities)
        {
            throw new NotImplementedException();
        }

        public Task InsertAsync(IEnumerable<Memo> entities, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }

        public void Update(Memo entity)
        {
            throw new NotImplementedException();
        }

        public void Update(params Memo[] entities)
        {
            throw new NotImplementedException();
        }

        public void Update(IEnumerable<Memo> entities)
        {
            throw new NotImplementedException();
        }

        Memo IRepository<Memo>.Find(params object[] keyValues)
        {
            throw new NotImplementedException();
        }

        ValueTask<Memo> IRepository<Memo>.FindAsync(params object[] keyValues)
        {
            throw new NotImplementedException();
        }

        ValueTask<Memo> IRepository<Memo>.FindAsync(object[] keyValues, CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }

        IQueryable<Memo> IRepository<Memo>.FromSql(string sql, params object[] parameters)
        {
            throw new NotImplementedException();
        }

        IQueryable<Memo> IRepository<Memo>.GetAll()
        {
            throw new NotImplementedException();
        }
    }
}
ToDoRepository.cs
c# 复制代码
using Arch.EntityFrameworkCore.UnitOfWork;
using Microsoft.EntityFrameworkCore;
using MyToDo.Api.Context;

namespace MyToDo.Api.Repository
{
    public class ToDoRepository : Repository<Todo>, IRepository<Todo>
    {
        public ToDoRepository(MyTodoContext dbContext) : base(dbContext)
        {
        }
    }
}
User
c# 复制代码
using Arch.EntityFrameworkCore.UnitOfWork;
using Arch.EntityFrameworkCore.UnitOfWork.Collections;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Query;
using MyToDo.Api.Context;
using MyToDo.Api.Migrations;
using System.Linq.Expressions;

namespace MyToDo.Api.Repository
{
    public class UserRepository : Repository<MyTodoContext>, IRepository<User>
    {
        public UserRepository(MyTodoContext dbContext) : base(dbContext)
        {
        }

        public int Count(Expression<Func<User, bool>> predicate = null)
        {
            throw new NotImplementedException();
        }

        public void Delete(User entity)
        {
            throw new NotImplementedException();
        }

        public void Delete(params User[] entities)
        {
            throw new NotImplementedException();
        }

        public void Delete(IEnumerable<User> entities)
        {
            throw new NotImplementedException();
        }

        public User GetFirstOrDefault(Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public TResult GetFirstOrDefault<TResult>(Expression<Func<User, TResult>> selector, Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public Task<TResult> GetFirstOrDefaultAsync<TResult>(Expression<Func<User, TResult>> selector, Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public Task<User> GetFirstOrDefaultAsync(Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public IPagedList<User> GetPagedList(Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public IPagedList<TResult> GetPagedList<TResult>(Expression<Func<User, TResult>> selector, Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, bool ignoreQueryFilters = false) where TResult : class
        {
            throw new NotImplementedException();
        }

        public Task<IPagedList<User>> GetPagedListAsync(Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, CancellationToken cancellationToken = default, bool ignoreQueryFilters = false)
        {
            throw new NotImplementedException();
        }

        public Task<IPagedList<TResult>> GetPagedListAsync<TResult>(Expression<Func<User, TResult>> selector, Expression<Func<User, bool>> predicate = null, Func<IQueryable<User>, IOrderedQueryable<User>> orderBy = null, Func<IQueryable<User>, IIncludableQueryable<User, object>> include = null, int pageIndex = 0, int pageSize = 20, bool disableTracking = true, CancellationToken cancellationToken = default, bool ignoreQueryFilters = false) where TResult : class
        {
            throw new NotImplementedException();
        }

        public void Insert(User entity)
        {
            throw new NotImplementedException();
        }

        public void Insert(params User[] entities)
        {
            throw new NotImplementedException();
        }

        public void Insert(IEnumerable<User> entities)
        {
            throw new NotImplementedException();
        }

        public ValueTask<EntityEntry<User>> InsertAsync(User entity, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }

        public Task InsertAsync(params User[] entities)
        {
            throw new NotImplementedException();
        }

        public Task InsertAsync(IEnumerable<User> entities, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }

        public void Update(User entity)
        {
            throw new NotImplementedException();
        }

        public void Update(params User[] entities)
        {
            throw new NotImplementedException();
        }

        public void Update(IEnumerable<User> entities)
        {
            throw new NotImplementedException();
        }

        User IRepository<User>.Find(params object[] keyValues)
        {
            throw new NotImplementedException();
        }

        ValueTask<User> IRepository<User>.FindAsync(params object[] keyValues)
        {
            throw new NotImplementedException();
        }

        ValueTask<User> IRepository<User>.FindAsync(object[] keyValues, CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }

        IQueryable<User> IRepository<User>.FromSql(string sql, params object[] parameters)
        {
            throw new NotImplementedException();
        }

        IQueryable<User> IRepository<User>.GetAll()
        {
            throw new NotImplementedException();
        }
    }
}

添加测试数据

1. 数据库添加测试数据

2. 编写测试程序

  • WeatherForecastController(覆盖到对应的类中)

    c# 复制代码
    private readonly IUnitOfWork uow;
    
    public WeatherForecastController(ILogger<WeatherForecastController> logger,IUnitOfWork unitOfWork)
    {
        _logger = logger;
        this.uow = unitOfWork;
    }
    public IEnumerable<WeatherForecast> Get()
    {
        //获取用户表
        var service= uow.GetRepository<User>();
        var res = service.GetAll();
        var rng = new Random();
    }
相关推荐
白杨尚青6 分钟前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
Chen—LSN15 分钟前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
传奇开心果编程17 分钟前
【Flutter入门练中学】第8课:动画与过渡
android·学习·flutter·ui·ios
Chen—LSN1 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
程序员yu1 小时前
会编网络:别被入门教程骗了,Python实用能力不在语法本身
开发语言·python·学习·算法
Lintongzg1 小时前
千卡训练的隐形账单:通信不是瓶颈
笔记·学习·性能优化·llm
dadaobusi1 小时前
学习: SIOV
学习
LuminousCPP2 小时前
从零开始学 C++(三):类和对象入门|从 struct 到 class,理解封装、对象与 this 指针
c++·笔记·学习·类和对象
传奇开心果编程2 小时前
【Flutter入门练中学】第11课:状态管理进阶与声明式路由
android·学习·flutter·ui·ios
承渊政道3 小时前
Linux系统学习【进程信号详细解析——认识、产生、保存以及捕捉信号】
linux·学习·ubuntu·ssh·vs code·进程信号