描述
剛剛使用EF,還沒搞明白,遇到下面問題,記錄一下。
都說Entity Framework好用,一直也沒用過,以前寫代碼都是ADO.NET,寫起來費時費力還沒什么大進展,如果能把這些事簡化一下把精力放到邏輯或者更有用的地方豈不是更好。所以想使用Entity Framework的Code First方式。
Code First,從字面的意思來看是先有代碼后有數據庫,通過代碼中的Model來創建數據庫,好像只能是通過Model來生成數據庫,至少我接觸2天以來是這樣。
如果我已經有一個數據庫了,而我又想用Code First怎么辦?
Code First添加現有數據庫
Visual Studio 2015有一個功能,添加Code First From Database,通過這個工具生成我們需要的Model和DbContext。
這個時候我們應該就可以享受Entity Framework帶給我們的方便快捷了。
但是如果的表結構需要變化怎么辦?
Migrations
這個工具可以讓我們做到,只要Model有變化我們可以通過一個命令行把已有的變化同步到數據庫中,使我們的Model和數據庫表結構一致。
Migrations使用方法:https://msdn.microsoft.com/zh-cn/data/jj591621
這個工具是可以同步我們的字段,但是同步的時候會從新創建一次數據表,提示錯誤表對象已經存在,這是因為,Migrations認為我們剛剛通過VS生成的Model是新建的表,所以他要先數據庫里創建一次表。
那我的Model剛剛生成的時候和數據庫中的結構是一樣的,有沒有辦法讓Migrations知道,不需要重新創建表了?
讓Migrations認識數據庫中的表
下面這個視頻已經給我們答案了,將現有表加入到Migrations中的方法:https://channel9.msdn.com/Blogs/EF/Migrations-Existing-Databases
其實很簡單。
1、使用ADO.NET實例數據模型工具,來自數據庫的Code First(VS2015),將需要的表的Model生成到項目中,這個時候必要的Model模型已經出來了。
2、我做的時候把生成模型的DbContext刪除掉了,用我自己的DbContext,如果自己沒創建過用生成的也可以,畢竟有那么多的DbContext連接的功能還是一樣的看起來很礙眼,把生成的DbSet復制到自己的DbContext中。
3、Enable-Migrations 命令,上邊有具體這個使用方法
4、使用Add-Migrations –Name Initial -IgnoreChanges,這里的IgnoreChnages參數是重點,忽略我們代碼中的變化,然Migrations認為我們的代碼已經和數據庫中的表格式一樣了,本來我們就是一樣的,我們剛剛通過VS工具生成的,這個時候還沒有完成任務,數據庫那邊並不知道你干了什么,這里只是添加了一個計划,Update-Datebase才能使我們的命令生效。
5、輸入Update-Database,這個時候應該就可以了,以后在有表結構變化,修改model然后使用Migrations更新就可以了。