接著上一篇博客繼續(xù)進行。上一篇博客只是顯示了簡單的MVC視圖頁,這篇博客接著進行,連接上數(shù)據(jù)庫,進行簡單的CRUD。

首先我在Controllers文件夾點擊右鍵,添加->控制器 彈出的對話框中選擇miniual Dependencies。在項目的根目錄下添加一個Models文件夾,在該文件夾下添加一個Users.cs類。(該類在數(shù)據(jù)庫中對應一張表,表名為Users 里邊有三個字段 其中ID是主鍵,自增的。)

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓 Users.cs

我再次在Controlles文件夾上點擊右鍵 ,添加->控制器,在彈出的對話框中選擇 視圖使用Entity Framework 的MVC控制器 模型類選擇我剛剛添加的那個Users.cs類,在數(shù)據(jù)上下文選項中,我選擇了新建一個名稱為UsersContext.cs 之后點擊完成。

系統(tǒng)會給我報錯,錯誤內(nèi)容為 “No executeable found matching command "dotnet-aspnet-codegenerator”,昨天和今天都困在了這個錯誤上邊,今天下午突然想到,在系統(tǒng)為我生成的帶MVC視圖頁的項目都沒有報錯,可以正常使用。于是我點開了項目的*.csproj文件,結(jié)果發(fā)現(xiàn)他比我多了這樣的一行代碼。

 <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />
  </ItemGroup>

于是我把這行代碼加進了我的*.csproj文件中去。加進去之后我發(fā)現(xiàn)可以了,那個錯誤解決了。突然之間覺得這個代碼好熟悉,應該是在微軟的asp.net core 官方說明文檔上見過,今天想查一下,這行代碼什么作用,可是找了一下,一時間沒有找到。

我再次重復在Controlles文件夾上點擊右鍵 ,添加->控制器,在彈出的對話框中選擇 視圖使用Entity Framework 的MVC控制器 模型類選擇我剛剛添加的那個Users.cs類,在數(shù)據(jù)上下文選項中,我選擇了新建一個名稱為UsersContext.cs 之后點擊完成。

接著系統(tǒng)又給我報了另一個錯誤 (如圖),不過這個錯誤就明顯了,說的大致內(nèi)容就是“基架編輯StrartUp.cs這個類用DI去注冊一個新的Context失敗....”

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

到了這里我想到了,我在添加mini Dependencies 控制器時系統(tǒng)為我生成的一個閱讀文件 “ScaffoldingReadMe.txt”,

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓 ScaffoldingReadMe.txt

于是我打開了這個文件,上邊的內(nèi)容說的很清楚讓我配置Startup.cs 文件于是我按照上邊進行一步步的配置了。直接粘貼就可以。我查看了一下我的跟目錄下沒有appsettings.json文件,于是我自己添加了這個ASP .NET配置文件,接下來就就可以順利的進行了。

添加了試圖頁,修改了數(shù)據(jù)庫的連接字符串。這樣基本都完成了。

演示效果如下:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

由于是從零開始構(gòu)建,既然是從零開始,我要搞清楚系統(tǒng)為我生成了什么東西,以及這些東西怎么用。

我點開了*.csproj文件發(fā)現(xiàn)用EF的時候系統(tǒng)我們添加了這些的引用。

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

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" />

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

 我依次查了對應包的描述說明

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 的數(shù)據(jù)庫,所以第二和三這兩個包應該是EF連數(shù)據(jù)必須用的

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();

這行代碼用到的,具體作用就是將運行過程中調(diào)試的錯誤給輸出來。

5.“A middleware that supports creating a communication channel between the development environment and one or more web browsers.”這個包的作用我猜測:在我們下斷點調(diào)試的時侯用到的

6.”Code Generation tool for ASP.NET Core. Contains the dotnet-aspnet-codegenerator command used for generating controllers and views.“這個包包含了一個命令 “dotnet-aspnet-codegenerator” 以后如果用EF的時候出現(xiàn)無法識別“dotnet-aspnet-codegenerator”命令錯誤 那就是沒有加這個包。包的作用就是生成控制器和對應的視圖。

我點開了系統(tǒng)為我添加的Data文件夾,里邊有一個*context.cs類從名字上可以看出這是一個數(shù)據(jù)上下文的類,在我們的*Controller.cs 中有一個靜態(tài)的只讀字段就是它,既然點開了*Contrllers.cs類,我就看看這個類里邊有什么。除了幾個View對應的action 還有一個構(gòu)造函數(shù),用于對*context.cs類進行初始化。我不禁想這個構(gòu)造函數(shù)在哪里用了,以及怎么初始化了? 我用反編譯工具也沒又找到。于是放了下來。

我點開了StartUp.cs 這個類。除了我們先前配置的那些東西之外,EF為我們添加了一個服務

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

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         }

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

這個服務就是配置了EF連接數(shù)據(jù)庫所用的一個上下文,以及聲明了連接的數(shù)據(jù)庫類型是sqlserver,連接數(shù)據(jù)庫的字符串是“UsersContext”里邊的值。

UsersContext這個字符串  在我們用EF之前在Startup.cs類中配置的構(gòu)造函數(shù)中聲明的。

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

        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();
        }

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

在這里我們設置了路徑為我們當前運行環(huán)境的根目錄,讀取的json文件名為“appsettings.json”,最后把它給了賦值給了Configurtation這個屬性。

所以我們在那里才能夠找到UsersContext里邊的值。

我點開了Views下的share文件夾,發(fā)現(xiàn)還有一個生成的文件 _ValidationScriptsPartial.cshtml

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓 _ValidationScriptsPartial.cshtml

這個應該就是model的驗證。里邊需要引用js文件。我這里沒有使用驗證,所以我也就沒有加上相應的js文件。

其實驗證很簡單的,比如我上邊的Users.cs類中為name加上一個特性 [Required(ErrorMessage = "不能為空")],在前臺的添加用戶界面中的輸入框標簽加上一個“asp-validation-for="Name"” 這樣當你點擊確定時,如果這個輸入框為空時系統(tǒng)會給提示,效果如下:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

” The validation attributes are checked on the client side before values are posted to the server, as well as on the server before the controller action is called.“這是微軟關于驗證的說明。也就是雙向的。

關于自定義雙向驗證??梢钥匆幌逻@篇博客 http://www.cnblogs.com/dudu/p/6812715.html

到了這里系統(tǒng)為我們生成的東西基本都在這里了??梢赃B接上數(shù)據(jù)庫進行CRUD了?;镜竭@里就要告一個段落了。

 

http://www.cnblogs.com/qulianqing/p/6818796.html