里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目
首先添加WebApi项目(ASP.NetCore版本)
右键解决方案>新建项目>
选择Web>ASP.NET Core Web应用程序(.NET Core)
选择Web API
此时的目录结构:
添加实体层Entity
右键添加>新建项目>.Net Core类库
添加后的目录结构
BaseEntity:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; using System.Text; namespace Entity.Core { /// <summary> /// DB表基础属性 /// </summary> public abstract class BaseEntity<T> { public BaseEntity() { CreteTime = DateTime.Now; } /// <summary> /// 主键Id /// </summary> [DataMember] [Key] public T Id { get; set; } /// <summary> /// DB版号,Mysql详情参考;http://www.cnblogs.com/shanyou/p/6241612.html /// </summary> //[Timestamp]//Mysql不允许byte[]类型上标记TimeStamp/RowVersion,这里使用DateTime类型配合标记ConcurrencyCheck达到并发控制 [ConcurrencyCheck] public DateTime RowVersion { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreteTime { get; set; } } }
Product:
using Entity.Core; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace Entity.Table { /// <summary> /// 商品类 /// </summary> public class Product : BaseEntity<long> { /// <summary> /// 名称 /// </summary> [StringLength(20)] [Required] public string Name { get; set; } /// <summary> /// 描述 /// </summary> [StringLength(500)] [Required] public string Description { get; set; } /// <summary> /// 类别 /// </summary> [Range(1, int.MaxValue)] public int Category { get; set; } /// <summary> /// 原价 /// </summary> [Required] public decimal Price { get; set; } /// <summary> /// 现价 /// </summary> public decimal Discount { get; set; } } }
添加数据层DAL:
右键添加>新建项目>.NET Core 类库
添加引用:
Microsoft.EntityFrameworkCore(也可加入Microsoft.AspNetCore.All,但会有用不到的功能造成浪费)
Microsoft.EntityFrameworkCore.Tools(迁移支持)
Pomelo.EntityFrameworkCore.MySql(Mysql支持)具体使用细则,请参考:Pomelo.EntityFrameworkCore.MySql使用细则
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.0-rtm-10062" /> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Entity\Entity.csproj" /> </ItemGroup> </Project>
添加DbContext数据上下文
using Entity.Table; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DAL { public class ProductContext : DbContext { //https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/complex-data-model public ProductContext(DbContextOptions<ProductContext> options) : base(options) { //在此可对数据库连接字符串做加解密操作 } public DbSet<Product> Courses { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } } }
ASP.Net Core API项目中引用刚创建的DAL类库
添加Service服务层
右键添加>新建项目>.NetCore 类库
添加引用:
添加Entity和DAL引用,其次再添加第三方数据仓储Microsoft.EntityFrameworkCore.UnitOfWork(最新)
<ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore.UnitOfWork" Version="2.0.1" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\DAL\DAL.csproj" /> <ProjectReference Include="..\Entity\Entity.csproj" /> </ItemGroup>
文件目录如下:
IProductService:
using System; using System.Collections.Generic; using System.Text; namespace Service.ProductService { public interface IProductService { string Test(); } }
ProductService:
using Entity.Table; using Microsoft.EntityFrameworkCore; namespace Service.ProductService { public class ProductService : IProductService { private readonly IUnitOfWork _unitOfWork; public ProductService(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public string Test() { var repo = _unitOfWork.GetRepository<Product>(); repo.Insert(new Product { Category = 1, Description = "此商品为澳洲代购,买不了吃亏买不了上当", Discount = (decimal)899.21, Price = (decimal)98.2, Name = "澳洲袋数粉", }); _unitOfWork.SaveChanges();//提交到数据库 var result = repo.GetFirstOrDefault()?.Name ?? string.Empty; return result; } } }
ASP.Net Core API添加刚创建的Service类库引用
<ItemGroup> <ProjectReference Include="..\DAL\DAL.csproj" /> <ProjectReference Include="..\Service\Service.csproj" /> </ItemGroup>
在 ASP.Net Core API控制器中使用service数据库
向Controller注入需要使用的接口
namespace ASP.Net_Core_API.Controllers { [Route("api/[controller]")] public class ValuesController : Controller { private IProductService _productService; public ValuesController(IProductService productService) { _productService = productService; } // GET api/values [HttpGet] public IEnumerable<string> Get() { var result = _productService.Test(); return new string[] { "value1", result }; } } }
Startup文件中加入Mysql支持和对应的需要的注入的service还有UnitOfWork的支持
完整文件如下:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.EntityFrameworkCore; using Entity.Table; using DAL; using Service.ProductService; namespace ASP.Net_Core_API { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ProductContext>(options => options.UseMySql(Configuration.GetConnectionString("MySqlConnection"))); services.AddUnitOfWork<ProductContext>(); services.AddScoped(typeof(IProductService), typeof(ProductService)); services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); } } }
配置appsettings.json中Mysql连接字符串
{ "ConnectionStrings": { "MySqlConnection": "Server=localhost;database=NetCore_WebAPI-Mysql;uid=root;pwd=111111;" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } } }
迁移数据库:
打开程序包管理器控制台:工具>NuGet包管理器>程序包管理器控制台,默认项目选中包含了DbCOntext的程序集,这里是DAL,程序包源选择全部
输入:
PM>add-migration init
待执行后输出"To undo this action,use Remove-Migration"表示生成了迁移代码
然后再输入:
PM>update-database
待执行后输出"Done"表示已成功更新数据库
完整操作如下
Tip:如果是非第一次迁移,就不能再输入PM>add-migration init,而是输入:
PM>add-migration "对本次迁移的说明"
例如,本次对Entity的某张表添加了Name属性.迁移时输入PM>add-migration AddName
输入以上待执行后,依旧输入以下即可
PM>update-database
会发现在DAL程序家下成功生成了以下目录
再打开数据库成功依据实体Entity生成了Product表