搭建連接MySql的三層架構的ASP.NetCore2.0的WebApi


這里我們用三層架構搭建一個連接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="Pomelo.EntityFrameworkCore.MySql" Version="2.0.0-rtm-10062" />
        <!--遷移支持必備-->
        <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
    </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()?.Description ?? string.Empty;
            return result;
        }
    }
}

ASP.Net Core API添加剛創建的Service類庫引用

<ItemGroup>
    <ProjectReference Include="..\DAL\DAL.csproj" />
    <ProjectReference Include="..\Service\Service.csproj" />
  </ItemGroup>

完整csproj如下:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
                <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\DAL\DAL.csproj" />
    <ProjectReference Include="..\Service\Service.csproj" />
  </ItemGroup>

</Project>

 

控制器中使用service

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Service.ProductService;
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")));//添加Mysql支持

            services.AddUnitOfWork<ProductContext>();//添加UnitOfWork支持
            services.AddScoped(typeof(IProductService), typeof(ProductService));//用ASP.NET Core自帶依賴注入(DI)注入使用的類
            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表

 運行程序

 

成功Run通,獎勵個雞腿壓壓驚

 專案下載鏈接:Demo

github源碼鏈接(持續更新):DotNetCore2.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM