创建工作单元
添加包
-
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(); }