CodeFirst從零搭建ASP.NETCore2.0


 

沒時間介紹了,廢話不說先上車

 

 

以下所有扯淡都是建立在.NETCore2.0環境已經搭建好

右鍵解決方案>新建項目>

選擇Web>ASP.NETCoreWeb應用程序(.NET Core)

 選擇Web應用程序,暫時不選擇啟用Docker,身份驗證選擇個人用戶賬戶(會自動生成一系列和用戶認證的代碼)

 隨后生代碼層次目錄如下:

其中會包含身份信息的相關實現,比如相關實體信息(user)之類的,如果想對擴展微軟自動的生成的用戶實體類,可在Models中的ApplicationUser下擴展,

在此ApplicationUser中添加屬性即可:比如添加叫WeChatId屬性,添加后如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;

namespace DotNetCore20.Web.Models
{
    // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser
    {
        /// <summary>
        /// 微信Id
        /// </summary>
        public string WeChatId { get; set; }
    }
}

在之后生成運行並遷移,數據庫的AspNetUsers中就會多出WeChatId 屬性.

一:安裝引用

nugnet恢復引用失效時,可在程序包管理控制台輸入:

dotnet restore  即可

 

會發現在恢復指令后在NuGet中會有一個Microsoft.VisualStudio.Web.CodeGeneration.Design的報錯,信息如下:

已使用“.NETPortable,Version=v0.0,Profile=Profile259, .NETFramework,Version=v4.6.1”而不是項目目標框架“.NETCoreApp,Version=v2.0”還原了包“Microsoft.Composition 1.0.27”。這可能會導致兼容性問題

這個庫是ASP.NET Core的代碼生成工具。包含用於生成控制器和視圖的dotnet-aspnet-codegenerator命令,暫時可先卸載,不影響項目運行.

對項目類庫的引用有以下幾種方式

1.Nuget去安裝(官網https://www.nuget.org/packages/)

2.右鍵依賴項點擊菜單中的添加引用

3.可在程序包管理控制台輸入:Install-Package 引用類庫名稱 

4.可右鍵編輯csproj工程文件進行添加,然后執行dotnet restore 

 

二.創建實體程序集

右鍵解決方案>添加項目>

  

首先創建抽象類,供Entity實體繼承,主要為每個實體提供公用屬性

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
using System.Text;

namespace DotNetCore20.Entity.Core
{
    /// <summary>
    /// DB表基底
    /// </summary>
    [Serializable]
    public abstract partial class BaseEntity
    {
        /// <summary>
        /// Id
        /// </summary>
        [DataMember]
        public long Id { get; set; }

        /// <summary>
        /// DB 資料版號
        /// </summary>
        [Timestamp]
        public byte[] RowVersion { get; set; }

        /// <summary>
        /// 創建時間
        /// </summary>
        [DataMember]
        public DateTime CreateTime { get; set; }

        /// <summary>
        /// 更新時間
        /// </summary>
        [DataMember]
        public DateTime UpdateTime { get; set; }

        /// <summary>
        /// 狀態
        /// </summary>
        [DataMember]
        public EnumState State { get; set; }
    }

    /// <summary>
    /// 狀態
    /// </summary>
    public enum EnumState
    {
        /// <summary>
        /// 刪除
        /// </summary>
        Delete = 1,

        /// <summary>
        /// 正常
        /// </summary>
        Normal = 0,
    }
}

添加一個UserExtend用戶擴展類(Entity):

using DotNetCore20.Entity.Core;
using System;
using System.Runtime.Serialization;

namespace DotNetCore20.Entity
{
    [DataContract]
    public class UserExtend : BaseEntity
    {
        /// <summary>
        /// 用戶Id
        /// </summary>
        [DataMember]
        public long UserId { get; set; }

        /// <summary>
        /// 昵稱
        /// </summary>
        [DataMember]
        public long NickName { get; set; }

    }
}

三.創建數據層 

 添加引用

DAL層需要用到EF實體映射相關和我們自己前面定義的Entity中的UserExtend實體表,所以要添加相關引用,DotNetCore20.Entity和  Microsoft.EntityFrameworkCore.Tools

快捷鍵:Ctrl+Alt+o 打開程序包管理器輸入以下:

install-package Microsoft.EntityFrameworkCore.Tools

如果是網絡限制下載失敗,推薦把nuget鏡像改為博客園資源,方法如下:

右鍵解決方案>管理解決方案的nuget程序包.顯示如下:

新建一個數據上下文類,目錄結構如下:

DotNetCoreDbContext內部代碼改為以下:

using DotNetCore20.Entity;
using Microsoft.EntityFrameworkCore;

namespace DotNetCore20.DAL.DbContext
{
    public class DotNetCoreDbContext : Microsoft.EntityFrameworkCore.DbContext
    {
        public DotNetCoreDbContext(DbContextOptions<DotNetCoreDbContext> options) : base(options)
        {
        }
        public DbSet<UserExtend> UserExtend { get; set; }
    }
}

在此基本的實體映射相關的代碼都完畢,現在還有一步,就是數據庫連接字符串的配置

首先打開appsettings.json文件,在ConnectionStrings節點下增加以下

"DotNetCoreConnection": "Server=(localdb)\\mssqllocaldb;Database=DotNetCoreDb;Trusted_Connection=True;MultipleActiveResultSets=true"

增加后如下:

{
    "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=DotNetCoreDefaultDb;Trusted_Connection=True;MultipleActiveResultSets=true", "DotNetCoreConnection": "Server=(localdb)\\mssqllocaldb;Database=DotNetCoreDb;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  }
}

 

 

再打開web網站下的Startup文件,在ConfigureServices方法中添加一下行:

//自定義數據庫連接字符串
            services.AddDbContext<DotNetCoreDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DotNetCoreConnection")));

 

增加后如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using DotNetCore20.Web.Data;
using DotNetCore20.Web.Models;
using DotNetCore20.Web.Services;
using DotNetCore20.DAL.DbContext;

namespace DotNetCore20.Web
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            //自定義數據庫連接字符串
            services.AddDbContext<DotNetCoreDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DotNetCoreConnection")));

            services.AddIdentity<ApplicationUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            // Add application services.
            services.AddTransient<IEmailSender, AuthMessageSender>();
            services.AddTransient<ISmsSender, AuthMessageSender>();

            services.AddMvc();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();

            app.UseAuthentication();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

 

 運行程序,點擊登陸(只要訪問數據庫的操作都可),出現錯誤頁面:

點擊應用遷移,即自動遷移數據庫.

由於兩個數據庫,只會自動遷移關於用戶的表AspNetUsers,

所以還得VS中程序包管理器中下命令遷移.

Add-Migration firstMigration -Context DotNetCoreDbContext

以上命令執行后再執行以下命令:

Update-Database -Context DotNetCoreDbContext;

然后查看數據庫會發現多出兩個數據庫,

DotNetCoreDefaultDb生成的為例,會生成如下表:

其中AspNetUsers就中會有之前添加的WeChatId字段

然后再次運行程序:

 

這樣一個完整的 Asp.NetCore2.0網站就初步運行起來了

下一篇將在DAL層增加Repository和UnitWorks,完成簡單crud的統一管理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM