標籤:sig 修改 mvc控制器 time cat 字元 action nic 讀檔案
接著上一篇部落格繼續進行。上一篇部落格只是顯示了簡單的MVC視圖頁,這篇部落格接著進行,串連上資料庫,進行簡單的CRUD。
首先我在Controllers檔案夾點擊右鍵,添加->控制器 彈出的對話方塊中選擇miniual Dependencies。在項目的根目錄下添加一個Models檔案夾,在該檔案夾下添加一個Users.cs類。(該類在資料庫中對應一張表,表名為Users 裡邊有三個欄位 其中ID是主鍵,自增的。)
public class Users { [Key] public int Id { get; set; } public string Name { get; set; } public string pwd { get; set; } }
Users.cs
我再次在Controlles檔案夾上點擊右鍵 ,添加->控制器,在彈出的對話方塊中選擇 視圖使用Entity Framework 的MVC控制器 模型類選擇我剛剛添加的那個Users.cs類,在資料內容選項中,我選擇了建立一個名稱為UsersContext.cs 之後點擊完成。
系統會給我報錯,錯誤內容為 “No executeable found matching command "dotnet-aspnet-codegenerator”,昨天和今天都困在了這個錯誤上邊,今天下午突然想到,在系統為我產生的帶MVC視圖頁的項目都沒有報錯,可以正常使用。於是我點開了項目的*.csproj檔案,結果發現他比我多了這樣的一行代碼。
<ItemGroup> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" /> </ItemGroup>
於是我把這行代碼加進了我的*.csproj檔案中去。加進去之後我發現可以了,那個錯誤解決了。突然之間覺得這個代碼好熟悉,應該是在微軟的asp.net core 官方說明文檔上見過,今天想查一下,這行代碼什麼作用,可是找了一下,一時間沒有找到。
我再次重複在Controlles檔案夾上點擊右鍵 ,添加->控制器,在彈出的對話方塊中選擇 視圖使用Entity Framework 的MVC控制器 模型類選擇我剛剛添加的那個Users.cs類,在資料內容選項中,我選擇了建立一個名稱為UsersContext.cs 之後點擊完成。
接著系統又給我報了另一個錯誤 (),不過這個錯誤就明顯了,說的大致內容就是“基架編輯StrartUp.cs這個類用DI去註冊一個新的Context失敗....”
到了這裡我想到了,我在添加mini Dependencies 控制器時系統為我產生的一個閱讀檔案 “ScaffoldingReadMe.txt”,
ASP.NET MVC core dependencies have been added to the project.However you may still need to do make changes to your project.1. Suggested changes to Startup class: 1.1 Add a constructor: public IConfigurationRoot Configuration { get; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } 1.2 Add MVC services: public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); } 1.3 Configure web app to use use Configuration and use MVC routing: public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
ScaffoldingReadMe.txt
於是我開啟了這個檔案,上邊的內容說的很清楚讓我配置Startup.cs 檔案於是我按照上邊進行一步步的配置了。直接粘貼就可以。我查看了一下我的跟目錄下沒有appsettings.json檔案,於是我自己添加了這個ASP .NET設定檔,接下來就就可以順利的進行了。
添加了試圖頁,修改了資料庫的連接字串。這樣基本都完成了。
示範效果如下:
由於是從零開始構建,既然是從零開始,我要搞清楚系統為我產生了什麼東西,以及這些東西怎麼用。
我點開了*.csproj檔案發現用EF的時候系統我們添加了這些的引用。
1 <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" />2 <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.1" />3 <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" />4 <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />5 <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />6 <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="1.1.0" />
我依次查了對應包的描述說明
1. ”Shared design-time components for Entity Framework Core tools. “應該就是一個組件,配合EF架構使用的。
2.“Microsoft SQL Server database provider for Entity Framework Core.”
3.“Design-time Entity Framework Core Functionality for Microsoft SQL Server.” 由於我用的是Sql Server 的資料庫,所以第二和三這兩個包應該是EF連資料必須用的
4.“Debug output logger provider implementation for Microsoft.Extensions.Logging. This logger logs messages to a debugger monitor by writing messages with System.Diagnostics.Debug.WriteLine()” 這個應該是我們在StartUp.cs類中添加的
loggerFactory.AddDebug();
這行代碼用到的,具體作用就是將運行過程中調試的錯誤給輸出來。
5.“A middleware that supports creating a communication channel between the development environment and one or more web browsers.”這個包的作用我猜測:在我們下斷點調試的時侯用到的
6.”Code Generation tool for ASP.NET Core. Contains the dotnet-aspnet-codegenerator command used for generating controllers and views.“這個包包含了一個命令 “dotnet-aspnet-codegenerator” 以後如果用EF的時候出現無法識別“dotnet-aspnet-codegenerator”命令錯誤 那就是沒有加這個包。包的作用就是組建控制器和對應的視圖。
我點開了系統為我添加的Data檔案夾,裡邊有一個*context.cs類從名字上可以看出這是一個資料內容的類,在我們的*Controller.cs 中有一個靜態唯讀欄位就是它,既然點開了*Contrllers.cs類,我就看看這個類裡邊有什麼。除了幾個View對應的action 還有一個建構函式,用於對*context.cs類進行初始化。我不禁想這個建構函式在哪裡用了,以及怎麼初始化了? 我用反編譯工具也沒又找到。於是放了下來。
我點開了StartUp.cs 這個類。除了我們先前配置的那些東西之外,EF為我們添加了一個服務
1 public void ConfigureServices(IServiceCollection services)2 {3 services.AddMvc();4 //下邊這是EF為我們添加的5 services.AddDbContext<UsersContext>(options =>6 options.UseSqlServer(Configuration.GetConnectionString("UsersContext")));7 8 }
這個服務就是配置了EF串連資料庫所用的一個上下文,以及聲明了串連的資料庫類型是sqlserver,串連資料庫的字串是“UsersContext”裡邊的值。
UsersContext這個字串 在我們用EF之前在Startup.cs類中配置的建構函式中聲明的。
public IConfigurationRoot Configuration { get; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); }
在這裡我們設定了路徑為我們當前運行環境的根目錄,讀取的json檔案名稱為“appsettings.json”,最後把它給了賦值給了Configurtation這個屬性。
所以我們在那裡才能夠找到UsersContext裡邊的值。
到了這裡系統為我們產生的東西基本都在這裡了。可以串連上資料庫進行CRUD了。基本到這裡就要告一個段落了。
從零開始構建一個的asp.net Core 項目(二)