Asp.net Core 2.0+EntityFrameWorkCore 2.0添加數據遷移

来源:http://www.cnblogs.com/NikoRanger/archive/2017/10/08/7637923.html
-Advertisement-
Play Games

Asp.net Core 由於依賴註入的廣泛使用,配置數據遷移,與Asp.net大不相同,本篇介紹一下Asp.net Core添加數據遷移的過程 添加Nuget包 首先新建一個 Model 類 User: public class User { //用戶編號(自增長主鍵) [Key] public ...


Asp.net Core 由於依賴註入的廣泛使用,配置數據遷移,與Asp.net大不相同,本篇介紹一下Asp.net Core添加數據遷移的過程

添加Nuget包

Install-Package Microsoft.EntityFramework.SqlServer

Install-Package Microsoft.EntityFramework.Tools

Install-Package Microsoft.EntityFramework.Design

首先新建一個 Model 類 User:

public class User
{
    //用戶編號(自增長主鍵)
    [Key]
    public long UserId { get; set; }

    //用戶名(必填項)
    [MaxLength(30),Required]
    public string UserName { get; set; }

    //密碼(必填項)
    [MaxLength(16),DataType(DataType.Password),Required]
    public string Password { get; set; }
}

然後建立MyDbContext類

public class BlogDbContext:DbContext
{
//由於依賴註入的關係,不加構造函數這裡會出現警告,但不影響數據遷移文件的建立,更新資料庫也沒影響
    public BlogDbContext(DbContextOptions<BlogDbContext> options):base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        //添加資料庫連接字元串
        builder.UseSqlServer(@"Server=.;User id=sa;Password=123;Database=BlogDbContext");
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        //添加FluentAPI配置
        var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);

        foreach(var type in typesToRegister)
        {
            dynamic configurationInstance = Activator.CreateInstance(type);
            builder.ApplyConfiguration(configurationInstance);
        }
    }
    //User相關表
    public DbSet<User> Users { get; set; }
}

然後配置AppSetting.json,添加資料庫連接字元串:

  "ConnectionStrings": {
    "DefaultConnection": "Server=.;User Id=sa;Password=123;Database=BlogDbContext;"
  },

在Startup.cs文件中註入資料庫服務:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<BlogDbContext>(options => options.UseSqlServer("DefaultConnection"));
        services.AddMvc();
    }

然後就可以進行數據遷移了,由於Asp .net Core 預設開啟數據遷移,所以直接添加數據遷移就可以了

Add-Migration Init

下麵添加種子數據,這裡不得不說踩過的一個大坑,添加種子數據的時候不僅與EF6.0 大不相同,跟EF Core1.X也大相徑庭,也怪自己,不去看官方文檔,非要去找教程(目前網上大部分教程都是1.x),哎,說多了都是淚。

添加一個初始化數據類,命名為SeedData.cs

 public static class SeedData
    {
        /// <summary>
        /// 
        /// 配置Seed
        /// 
        /// </summary>
        public static void Initialize(IServiceProvider app)
        {
            var _dbContext= app.GetRequiredService<BlogDbContext>();
            
            //如果已經有數據就直接返回
            if(_dbContext.Users.Any())
            {
                return;
            }
                //添加User Seed
                _dbContext.Users.Add(new User { UserName = "Niko", Password = "123" });

                _dbContext.SaveChanges();

        }
    }

與EF Core 1.x不同的是,2.0是在Program.cs里的Main方法里(1.x是在Startup.cs中的Configure方法中)添加初始化方法。修改Main方法為:

        public static void Main(string[] args)
        {
            var host = BuildWebHost(args);
            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    SeedData.Initialize(services);
                }
                catch(Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB");
                }
            }
                host.Run();
        }

接下來更新資料庫

Update-Database -Verbose

沒有問題,去資料庫里查看,添加的種子數據,並沒有加進來SQL Profile中並沒有監測到添加數據操作。在Main方法加個斷點,啟動IIS執行,逐步執行,發現,只有在程式運行的時候,才會添加種子數據到資料庫。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇作為技術分享系列的第四篇,詳細講一下手繪視頻中 Surface Pen 和 Surface Dial 的使用場景。 先放一張微軟官方商城的圖,Surface 的使用中結合了 Surface Pen 和 Surface Dial。 Surface Pen 的使用場景不難想象,就像 iPad 和 A ...
  • DataRead 和DataSet區別 dataset表示一個數據集,是數據在記憶體中的緩存。 可以包括多個表DatSet 連接資料庫時是非面向連接的。把表全部讀到Sql中的緩衝池,並斷開於資料庫的連接 datareader 連接資料庫時是面向連接的。讀表時,只能向前讀取,讀完數據後有用戶決定是否斷開 ...
  • C# 的集合類型中, 都有Synchronized靜態方法, 和SyncRoot實例方法 對於ArrayList以及Hashtable 集合類來講,當需要做到線程安全的時候,最好利用其自帶的屬性SyncRoot 來做到,儘管也可以使用其Synchronized()方法來實現,但是使用屬性會更好。 線 ...
  • XAML代碼: <local:WorkSpaceContent x:Class="SunCreate.CombatPlatform.Client.NoticeMarquee" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentati ...
  • 1. 引言 對於ASP.NET Core應用程式來說,我們要記住非常重要的一點是:其本質上是一個獨立的控制台應用,它並不是必需在IIS內部托管且並不需要IIS來啟動運行(而這正是ASP.NET Core跨平臺的基石)。ASP.NET Core應用程式擁有一個內置的 Self Hosted(自托管) ...
  • 在我們的很多框架或者項目應用中,緩存在一定程度上可以提高程式的響應速度,以及減輕伺服器的承載壓力,因此在一些地方我們都考慮引入緩存模塊,這篇隨筆介紹使用開源緩存框架CacheManager來實現數據的緩存,在微信開發框架中,我們有一些常用的處理也需要應用到緩存,因此本隨筆以微信框架為例介紹緩存的實際... ...
  • 背水一戰 Windows 10 之 控制項(控制項基類): CoreDispatcher, 依賴屬性的設置與獲取, 依賴屬性的變化回調 ...
  • namespace MyLamdba{ class Program { static void Main(string[] args) { LamDbaShow.Show(); Console.ReadKey(); } }} namespace MyLamdba{ public delegate v ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...