前言:
最近在开始尝试使用dotnet core做开发,dotnet core发布到1.1也越发成熟了,微软提供的文档也很详细,跟着
而EF Core的文档主要针对Sql Server,其他数据库并没有那么详细,写的过程中确实遇到一些问题,搜集各方资料,这里做一个汇总。
先根据文档写出一个简单的测试程序,这里不再赘述
这里因为VS2017低版本的bug可能会不能运行,手动检查更新,工具->扩展和更新->更新
然后在Package Manager Console输入
Install-Package MySql.Data.EntityFrameworkCore -Pre
安装好后,修改startup文件中ConfigureServices方法,
将UseSqlServer改为UseMySQL
1 public void ConfigureServices(IServiceCollection services)2 {3 services.AddDbContext(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 = newNorthwindContext())2 {3 var parameter = newSqlParameter4 {5 ParameterName = "@CustomerID",6 Value = "ALFKI"
7 }8
9 context.Database.ExecuteSqlCommand("[dbo].[CustOrderHist] @CustomerID", parameter)10 }
2
1 using (var context = newNorthwindContext())2 {3 var parameter = newSqlParameter4 {5 ParameterName = "@City",6 Value = "London"
7 }8
9 var customers =context.Customers10 .FromSql(@"SELECT * FROM ""Customers"" WHERE ""City"" = @city", parameter)11 .ToArray();12 }
3以及传统方法,这里补充上Mysql存储过程调用的例子
1 var test_cores = newTest_Core[] { };2 var test_core = newTest_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 = awaitcmd.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 = newWebHostBuilder()2 .UseContentRoot(Directory.GetCurrentDirectory())3 .UseConfiguration(config)4 .UseStartup()5 .UseKestrel(options =>
6 {7 if (config["threadCount"] != null)8 {9 options.ThreadCount = int.Parse(config["threadCount"]);10 }11 })12 .UseUrls("http://localhost:5000");
三、关于发布
如果想发布对应版本,这里以Ubuntu.16.04-x64为例,在csproject文件中添加对应的RID,参考.NET Core 运行时标识符 (RID) 目录
$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;
ubuntu.16.04-x64
控制台输入
dotnet publish -r ubuntu.16.04-x64
即可publish到 ubuntu.16.04-x64文件夹,参考issue77