1. 程式人生 > >從零開始構建一個的asp.net Core 項目(二)

從零開始構建一個的asp.net Core 項目(二)

mage .... cfi web execute 運行 figure 今天 deb

接著上一篇博客繼續進行。上一篇博客只是顯示了簡單的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 項目(二)