前言:
最近在开始尝试使用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