1 创建项目
选择asp.net core 项目,core3.1 api
命名Routine.Api
2 安装nuget依赖包
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.Sqlite
3 添加实体类和数据库上下文类
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Routine.Api.Entities { public class Company { public Guid Id { get; set; } public string Name { get; set; } public string Introduction { get; set; } public ICollection<Employee> Employees { get; set; } } }
using System; namespace Routine.Api.Entities { public class Employee { public Guid Id { get; set; } public Guid CompanyId { get; set; } public string EmployeeNo { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Gender Gender { get; set; } public DateTime DateOfiBirth { get; set; } public Company Company { get; set; } } }
namespace Routine.Api.Entities { public enum Gender { 男=1, 女=2 } }
using Microsoft.EntityFrameworkCore; using Routine.Api.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Routine.Api.Data { public class RoutineDbContext:DbContext { public RoutineDbContext(DbContextOptions<RoutineDbContext> options) :base(options) { } public DbSet<Company> Companies { get; set; } public DbSet<Employee> Employees { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Company>() .Property(x => x.Name).IsRequired().HasMaxLength(100); modelBuilder.Entity<Company>() .Property(x => x.Introduction).HasMaxLength(500); modelBuilder.Entity<Employee>() .Property(x => x.EmployeeNo).IsRequired().HasMaxLength(10); modelBuilder.Entity<Employee>() .Property(x => x.FirstName).IsRequired().HasMaxLength(50); modelBuilder.Entity<Employee>() .Property(x => x.LastName).IsRequired().HasMaxLength(50); modelBuilder.Entity<Employee>() .HasOne(x => x.Company) .WithMany(x => x.Employees) .HasForeignKey(x => x.CompanyId).OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity<Company>().HasData( new Company { Id=Guid.NewGuid(), Name="Microsoft", Introduction="Great Company" }, new Company { Id = Guid.NewGuid(), Name = "Google", Introduction = "Dont Company" }, new Company { Id = Guid.NewGuid(), Name = "Alipapa", Introduction = "Fubao Company" }); } } }
4 添加服务类
using Routine.Api.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Routine.Api.Services { public interface ICompanyRepository { Task<IEnumerable<Company>> GetCompaniesAsync(); Task<IEnumerable<Company>> GetCompaniesAsync(IEnumerable<Guid> companyIds); Task<Company> GetCompanyAsync(Guid companyId); void AddCompany(Company company); void UpdateCompany(Company company); void DeleteCompany(Company company); Task<bool> CompanyExistsAsync(Guid companyId); Task<IEnumerable<Employee>> GetEmployeesAsync(Guid companyId); Task<Employee> GetEmployeesAsync(Guid companyId,Guid employeeId); void AddEmployee(Guid companyId, Employee employee); void UpdateEmployee(Employee employee); void DeleteEmployee(Employee employee); Task<bool> SaveAsync(); } }
using Microsoft.EntityFrameworkCore; using Routine.Api.Data; using Routine.Api.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Routine.Api.Services { public class CompanyRepository : ICompanyRepository { private readonly RoutineDbContext _context; public CompanyRepository(RoutineDbContext context) { _context = context??throw new ArgumentNullException(nameof(context)); } public async Task<IEnumerable<Company>> GetCompaniesAsync() { return await _context.Companies.ToListAsync(); } public async Task<IEnumerable<Company>> GetCompaniesAsync(IEnumerable<Guid> companyIds) { if (companyIds == null) { throw new ArgumentNullException(nameof(companyIds)); } return await _context.Companies .Where(x => companyIds.Contains(x.Id)) .OrderBy(x => x.Name) .ToListAsync(); } public async Task<Company> GetCompanyAsync(Guid companyId) { if (companyId == Guid.Empty) { throw new ArgumentNullException(nameof(companyId)); } return await _context.Companies.FirstOrDefaultAsync(x => x.Id == companyId); } public void AddCompany(Company company) { if (company == null) { throw new ArgumentNullException(nameof(company)); } company.Id = Guid.NewGuid(); foreach (var employee in company.Employees) { employee.Id = Guid.NewGuid(); } _context.Companies.Add(company); } public void UpdateCompany(Company company) { //if (company == null) //{ // throw new ArgumentNullException(nameof(company)); //} //_context.Entry<Company>(company).State = EntityState.Modified; } public void DeleteCompany(Company company) { if (company == null) { throw new ArgumentNullException(nameof(company)); } _context.Companies.Remove(company); } public async Task<bool> CompanyExistsAsync(Guid companyId) { if (companyId == Guid.Empty) { throw new ArgumentNullException(nameof(companyId)); } return await _context.Companies.AnyAsync(x => x.Id == companyId); } public async Task<IEnumerable<Employee>> GetEmployeesAsync(Guid companyId) { if (companyId == Guid.Empty) { throw new ArgumentNullException(nameof(companyId)); } return await _context.Employees .Where(x => x.CompanyId == companyId) .OrderBy(x => x.EmployeeNo) .ToListAsync(); } public async Task<Employee> GetEmployeesAsync(Guid companyId, Guid employeeId) { if (companyId == Guid.Empty) { throw new ArgumentNullException(nameof(companyId)); } if (employeeId == Guid.Empty) { throw new ArgumentNullException(nameof(employeeId)); } return await _context.Employees .Where(x => x.CompanyId == companyId&& x.Id==employeeId) .FirstOrDefaultAsync(); } public void AddEmployee(Guid companyId, Employee employee) { if (companyId == Guid.Empty) { throw new ArgumentNullException(nameof(companyId)); } if (employee == null) { throw new ArgumentNullException(nameof(employee)); } employee.CompanyId = companyId; _context.Employees.Add(employee); } public void DeleteEmployee(Employee employee) { if (employee == null) { throw new ArgumentNullException(nameof(employee)); } _context.Employees.Remove(employee); } public void UpdateEmployee(Employee employee) { //_context.Employees } public async Task<bool> SaveAsync() { return await _context.SaveChangesAsync() >= 0; } } }
5 startup类中注册服务
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddScoped<ICompanyRepository, CompanyRepository>(); services.AddDbContext<RoutineDbContext>(builder=> { builder.UseSqlite("Data Source=routine.db"); }); }
6 Program中添加自动迁移代码
public static void Main(string[] args) { var host = CreateHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { try { var dbContext = scope.ServiceProvider.GetService<RoutineDbContext>(); dbContext.Database.EnsureDeleted(); dbContext.Database.Migrate(); } catch (Exception e) { var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>(); logger.LogError(e, "Database Migration Error!"); } } host.Run(); }
7 添加迁移文件
add-migration initial