首頁 > 軟體

ASP.NET Core 1.1通過EF Core存取MySQL及Linux偵錯

2020-06-16 17:14:42

前言:

最近在開始嘗試使用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");
 

三、關於發布

如果想發布對應版本,這裡以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


IT145.com E-mail:sddin#qq.com