1. 程式人生 > >EF6學習筆記一:code-first簡單創建數據庫、表的一些過程

EF6學習筆記一:code-first簡單創建數據庫、表的一些過程

time img install 類名 開啟 屬性 bject nbsp 程序包管理

我的EF學習筆記是按照 汪鵬(網名Jeffcky) 大俠《你必須掌握的Entity Framework 6.x與Core 2.0》來弄的。

這也是我第一篇博客,感覺這東西不能亂寫啊,算了,幹吧。

EF我之前是做過的,但是只是一些零碎的東西,不成系統。

EF是什麽呢?ORM框架object renational mapping 對象關系映射,下面我就用自己的話來了。

數據庫裏面存放數據用表,而我們程序代碼使用類,一個是數據世界的弄法,一個是對象世界的弄法。EF就是為我們做這種對象映射的處理,讓我可以不用關心數據庫,只關系類 怎麽設計就行了。

我說完了。它主要就是這個對吧,當然會有其他的很多東西,通過程序直接創建數據庫,然後更多的精力放到了類上,業務邏輯上,突然多出來的精力沒處使,是不是就弄出了什麽領域驅動設計?

現在來創建一個控制臺程序,安裝EF,打開程序包管理控制臺輸入命令:install-package entityframework

創建Blog類,寫一個EFDbContext類,這個類派生自DbContext,為blog公開一個DbSet屬性

然後在main方法裏面實例化上下文對象,添加一個blog實例,接著查詢這個實例,打印出來

然後控制臺大概過了十多秒,看到了剛剛添加的數據,那麽簡單的創建數據庫、表就完了~

namespace _20190105
{
    public class Blog
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Url { get; set; }
        public DateTime? CreatedTime { get; set; }
        public double Double { get; set; }
        public float Float { get; set; }
        
    }
}

  

namespace _20190105
{
    //  此上下文是與數據庫交互的一個中間橋梁,可以稱之為會話,為每一個模型公開一個DbSet<>,定義DbSet有三種方式
    public class EFDbContext:DbContext
    {
        // DbSet 三種設計方式,不太懂,我隨便弄了一種
        //public DbSet<Blog> Blog { get; set; }
        //public IDbSet<Blog> Blog { get; set; }
        public DbSet<Blog> Blog {
            get { return Set<Blog>(); }
        }
    }
}

  

namespace _20190105
{
    class Program
    {
        static void Main(string[] args)
        {
            //  上下文實例化,添加一個blog實例
            using (EFDbContext db = new EFDbContext())
            {
                db.Blog.Add(new Blog
                {
                    CreatedTime = DateTime.Now,
                    Double = 11.11,
                    Float = 2.2f,
                    ID = 1,
                    Name = "第er篇博客",
                    Url = "http://localhost:8080"
                });
                db.SaveChanges();

                Console.WriteLine(JsonConvert.SerializeObject(db.Blog.ToList()));
            }
        }
    }
}

  

技術分享圖片



來看看數據庫,對照著模型看一下,數據庫和表是什麽樣子的。這裏要註意一點,如果是按照上面的幾步操作,EF默認會給我們把數據庫創建到localdb裏面

localdb是個什麽玩意,他也是個數據庫,但是這和我們SQL server數據庫管理工具創建的數據庫有什麽不一樣呢?網上說這個localdb完全是為了針對開發人員使用的,一個數據庫最大容量為10G,那他到底是在安裝VS的時候安裝的,還是在裝SQLserver安裝的呢?

要查看剛剛創建的數據庫,在VS上點擊“視圖”-->"SQL server數據庫對象資源管理器",也可以通過SQL server去連接它

技術分享圖片

通過SQL server管理工具連接到這個localdb,有可能你的機器上沒有安裝這個localdb,我這個沒有刻意去安裝,反正就是有這個東西

技術分享圖片

首先,數據庫創建在localdb裏面,數據庫的名稱是我們項目命名空間+上下文類名

然後我們看表名,我們的DbSet<>屬性是Blog,但是在數據庫裏面表明成了Blogs,變成復數形式了

然後我們看字段,ID默認給我弄成了主鍵,並且設置為自增長

string類型對應nvarchar(max),並且允許為空

double類型對應float

float類型對應real

datetime?可空類型對應datetime,可空

剛剛我添加一個條數據,ID為1,現在我又添加一個blog實例,ID還是1,但是沒有報錯,正確插入進去了,ID自增長為2

然後我在Blog中添加一個字段Test,再次運行,報錯

未經處理的異常: System.InvalidOperationException: The model backing the ‘EFDbContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database (技術分享圖片http://go.microsoft.com/fwlink/?LinkId=238269).

他說模型放生了改變,讓我用codefirst 遷移來更新數據庫 行,然後我在程序包管理器控制臺輸入 add-migration jinshantest,報錯 No migrations configuration type was found in the assembly ‘20190105‘. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).

他說沒有在程序集中發現遷移配置類型,可以使用enable-migrations添加配置

就是說要用這個遷移,要先執行 enable-migrations 命令來開啟一下遷移,這些命令不區分大小寫

我執行了命令:enable-migrations 發現我的項目中被創建了一個Migrations文件夾,裏面有兩個文件

技術分享圖片

但是我並沒有看到剛剛添加的那個Test屬性,先不管,我們直接更新看看
輸入命令:update-database

技術分享圖片

然後他說沒有掛起的顯示遷移,什麽意思,不就是說沒什麽可以更新的嗎?

然後我再次生成一個新的遷移類文件,輸入命令:add-magration jinshantest 這個jinshantest就是你為這個遷移文件取的一個名字

技術分享圖片

現在就有了。

那麽現在就更新到數據庫裏面吧,現在我們再來執行遷移:update-database -verbose 加上-verbose就是顯示遷移的詳細信息

技術分享圖片

可以看到它根據遷移文件的內容,生成了創建列的SQL語句,並更新到了數據庫

我現在又想到,我再添加一個字段“Test2”並且設置為非空,看看它能不能給我更新到數據庫,更新之後是什麽樣子,這需求很正常吧

技術分享圖片

改動了模型就要做數據遷移,繼續add-migration jinshantest2 生成遷移文件

技術分享圖片

可以的,他生成的SQL語句是下面這樣的。

ALTER TABLE [dbo].[Blogs] ADD [Test2] [nvarchar](max) NOT NULL DEFAULT ‘‘



現在我想要EF面向我的SQL server 而不是localDB 那麽我需要在app.config文件中加上數據庫連接字符串的配置,他要其他的我也不會去配,因為Code-first不就是不用到處配東西,直接寫代碼就行嗎? Initial Catlog=TestDB,這個TestDB在我數據庫裏面不存在,我當然不會弄一個已存在的數據庫,我的目的就是要讓它給我創建數據庫 技術分享圖片

然後修改我們的Dbcontext文件,告訴EF我們的數據庫連接字符串

技術分享圖片

於是我運行程序,報錯了:找不到對象“dbo.Blogs”

我檢查我的的SQL server 裏面什麽都沒有。

難道是因為我Main方法裏有做數據持久化的代碼,他在插入數據的時候找不到表,就報錯了?

剛剛在localDB裏面不是好好的嗎?在對localDB操作的時候,我什麽都沒做,他自動給我創建數據庫,創建表

難道我現在還要在SQL server中創建一個數據庫然後創建一個表?那要你做什麽?

行,我弄了下,大概知道了,我要先做數據遷移才行,就是把剛剛的那些遷移文件現在針對我的SQL server執行,於是命令行輸入:update-database -verbose

行了,數據庫和表都有了。

SQLserver 和localDB就是這一點區別,localDB不用先遷移。

後面還有其他的很多配置,不過總算是能夠簡單地創建數據庫和表了,並且修改model後,我們利用數據遷移對數據庫做更新,還是比較完整吧。

書中的內容都是一點點講起的,數據遷移在後面才會講到。書有目錄啊,必須跟著目錄走啊。我自己隨便弄,還是覺得要用一個完整的東西把這些散碎的東西串起來好一些。

EF6學習筆記一:code-first簡單創建數據庫、表的一些過程