感谢支持
我们一直在努力

ASP.NET Core 1.1通过EF Core访问MySQL及Linux调试

前言:

最近在开始尝试使用dotnet core做开发,dotnet core发布到1.1也越发成熟了,微软提供的文档也很详细,跟着Getting started with ASP.NET Core MVC and Entity Framework Core using Visual Studio (1 of 10) 的步骤可以掌握一个基本的ASP.NET Core web application的创建方法。

而EF Core的文档主要针对Sql Server,其他数据库并没有那么详细,写的过程中确实遇到一些问题,搜集各方资料,这里做一个汇总。

一、访问MySQL

 Getting started with ASP.NET Core MVC and Entity Framework Core using Visual Studio (1 of 10)

先根据文档写出一个简单的测试程序,这里不再赘述

这里因为VS2017低版本的bug可能会不能运行,手动检查更新,工具->扩展和更新->更新

然后在Package Manager Console输入

Install-Package MySql.Data.EntityFrameworkCore -Pre

安装MySql对应的provider(同时还有个人开发的provider,本文将不再介绍)

安装好后,修改startup文件中ConfigureServices方法,

将UseSqlServer改为UseMySQL

1 public void ConfigureServices(IServiceCollection services)
2 {
3     services.AddDbContext<YourContent>(options =>
4         options.UseMySQL(Configuration.GetConnectionString("MysqlConnection")));
5 
6     services.AddMvc();
7 }

此时若不能识别命名空间,需要手动添加

using MySQL.Data.EntityFrameworkCore.Extensions;

7.0.7-m61版本的provider访问Mysql可能需要在执行前后打开和关闭连接

1 _context.Database.OpenConnection();
2 await _context.SaveChangesAsync();
3 _context.Database.CloseConnection();

如果要执行存储过程或者sql有三种方法(1和2是sql server的例子,做适当修改即可),可以参考issue3115

1

 1 using (var context = new NorthwindContext())
 2 {
 3     var parameter = new SqlParameter
 4     {
 5         ParameterName = "@CustomerID",
 6         Value = "ALFKI"
 7     }
 8 
 9     context.Database.ExecuteSqlCommand("[dbo].[CustOrderHist] @CustomerID", parameter)
10

2

 1 using (var context = new NorthwindContext())
 2 {
 3     var parameter = new SqlParameter
 4     {
 5         ParameterName = "@City",
 6         Value = "London"
 7     }
 8 
 9     var customers = context.Customers
10         .FromSql(@"SELECT * FROM ""Customers"" WHERE ""City"" = @city", parameter)
11         .ToArray();
12 }

3以及传统方法,这里补充上Mysql存储过程调用的例子

 1 var test_cores = new Test_Core[] { };
 2 var test_core = new Test_Core();
 3  
 4 var parameter =  new MySqlParameter("?p_id", MySqlDbType.Int16);
 5 parameter.Value = 1;
 6 parameter.Direction = ParameterDirection.Input;
 7 //1            
 8 using (var cmd = _context.Database.GetDbConnection().CreateCommand())
 9 {
10     _context.Database.OpenConnection();
11     
12     cmd.CommandType = CommandType.StoredProcedure;
13     cmd.CommandText = "sp_test_core";
14     cmd.Parameters.Add(parameter);
15     DbDataReader result;
16     result = await cmd.ExecuteReaderAsync();
17     while (result.Read())
18     {
19         test_core.Id = int.Parse(result[0].ToString());
20         test_core.key = result[1].ToString();
21         test_core.value = result[2].ToString();
22     }
23     _context.Database.CloseConnection();
24 }
25     //2
26     var result_num = _context.Database.ExecuteSqlCommand("sp_test_core(?p_id)", parameter);
27 
28     //3 TEST_CORE是content中定义的model的DbSet
29     test_cores = _context.TEST_CORE.FromSql(@"call sp_test_core(?p_id)", parameter).ToArray();
30  

DataTable目前已经没有了,不排除会在之后的版本加回来的可能性,现在接收数据使用DbDataReader

编写测试页面即可看到结果,MVC相关这里不再赘述。

二、Linux调试

dotnet core提供的跨平台的web server为KestrelHttpServer,将项目文件完整拷贝到linux机上,在项目目录先输入

dotnet restore

再输入

dotnet run

即可运行调试。

如果想要在局域网中远程访问页面,在安装openssh并运行之后,

通过以下命令运行,即可自定义端口,ip为局域网中本地分配的ip,参考issue639

ASPNETCORE_URLS="http://192.168.0.1:5000" dotnet run

dotnet core默认端口是localhost:5000,也可以在程序中使用UseUrls自定义端口

1 var builder = new WebHostBuilder()
2         .UseContentRoot(Directory.GetCurrentDirectory())
3         .UseConfiguration(config)
4        .UseStartup<Startup>()
5        .UseKestrel(options =>
6         {
7            if (config[threadCount] != null)
8             {
9                options.ThreadCount = int.Parse(config[threadCount]);
10             }
11         })
12        .UseUrls(http://localhost:5000);
 
更多相关可参考Introduction to Kestrel web server implementation in ASP.NET Core

三、关于发布

如果想发布对应版本,这里以Ubuntu.16.04-x64为例,在csproject文件中添加对应的RID,参考.NET Core 运行时标识符 (RID) 目录

<PropertyGroup>
    <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
    <RuntimeIdentifier>ubuntu.16.04-x64</RuntimeIdentifier>
  </PropertyGroup>

控制台输入

dotnet publish -r ubuntu.16.04-x64

即可publish到 ubuntu.16.04-x64文件夹,参考issue77

可以通过Nginx等反向代理来部署core程序,参考Set up a hosting environment for ASP.NET Core on Linux with Nginx, and deploy to it

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143949.htm

赞(0) 打赏
转载请注明出处:服务器评测 » ASP.NET Core 1.1通过EF Core访问MySQL及Linux调试
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏