码迷,mamicode.com
首页 > 数据库 > 详细

搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

时间:2017-09-19 19:46:14      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:一个   UI   img   上下文   描述   readonly   搭建   pos   interface   

里我们用三层架构搭建一个连接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表

技术分享

 

搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

标签:一个   UI   img   上下文   描述   readonly   搭建   pos   interface   

原文地址:http://www.cnblogs.com/xiaoliangge/p/7543773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!