Entity?Framework代碼優(yōu)先Code?First入門
CodeFirst是EntityFramework 4.1后新增的一種映射方式,在這種方式下,開發(fā)人員只需要編寫代碼,由ORM框架自動(dòng)動(dòng)創(chuàng)建模型和數(shù)據(jù)庫,數(shù)據(jù)庫則可看作類似于XML一樣序列化的方式,非常簡潔(由于開發(fā)人員可以無需關(guān)心數(shù)據(jù)庫的具體結(jié)構(gòu),最初也有叫做CodeOnly的)。
下面就以一個(gè)簡單的例子演示一下如何使用CodeFirst。
一、用Nuget添加EntityFramework框架的引用。
二、編寫代碼
static void Main(string[] args) { using (var db = new BloggingContext()) { // Create and save a new Blog Console.Write("Enter a name for a new Blog: "); var name = Console.ReadLine(); if (!string.IsNullOrEmpty(name)) { var blog = new Blog { Name = name }; db.Blogs.Add(blog); db.SaveChanges(); } // Display all Blogs from the database var query = from b in db.Blogs orderby b.Name select b; Console.WriteLine("All blogs in the database:"); foreach (var item in query) { Console.WriteLine(item.Name); } Console.WriteLine("Press any key to exit..."); } } public class Blog { public int BlogId { get; set; } public string Name { get; set; } } public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } }
這里和以前的一點(diǎn)區(qū)別就是增加了一個(gè)繼承自DbContext的BloggingContext對象,它表示數(shù)據(jù)庫對象,Blogs則是它的表。如果不關(guān)心數(shù)據(jù)庫的存儲方式大可以把它看作一個(gè)全局變量。
上述代碼是可以直接執(zhí)行的,雖然這里沒有主動(dòng)指定數(shù)據(jù)庫,但程序默認(rèn)使用LocalDb或SqlExpress創(chuàng)建庫,因?yàn)槲矣玫氖荲S2012,就使用了LocalDb創(chuàng)建了庫,并且生成的表的結(jié)構(gòu)如下:
如下是CodeFirst映射數(shù)據(jù)庫的一些基本原則:
數(shù)據(jù)庫名:當(dāng)沒有顯示設(shè)置數(shù)據(jù)連接的時(shí)候,默認(rèn)的數(shù)據(jù)庫是:.\SQLEXPRESS。如果本地沒有SQLEXPRESS,EF會嘗試LocalDb ((localdb)\v11.0) .\SQLEXPRESS 這個(gè)數(shù)據(jù)庫包含在VS2012中。數(shù)據(jù)庫的名稱一般是DbContext的"命名空間.類名"
表名:表名默認(rèn)為模型類名的復(fù)數(shù)形式,并且每個(gè)表都使用dbo構(gòu)架創(chuàng)建。這里生成的就是dbo.Lodgings.
主鍵:Code First會默認(rèn)將以類似Id結(jié)尾來命名的屬性當(dāng)作主鍵,如ID,Id,本例中的DestinationId都自動(dòng)設(shè)置為主鍵。如果該屬性是int類型,Code First會在數(shù)據(jù)庫中默認(rèn)將該列設(shè)置為自增長。
數(shù)據(jù)類型:在SQL Server中,字符串默認(rèn)映射成nvarchar(max),byte[]映射成varbinary(max),bool映射成bit,decimal映射成decimal(18, 2),float映射成float。同時(shí)因?yàn)閎ool,decimal,float等是值類型,不能為給他們分配Null值。所生成的數(shù)據(jù)庫會要求對應(yīng)的列非空。如Lodgings表中的IsResort
外鍵:當(dāng)CodeFirst檢測到一對多的映射時(shí),會自動(dòng)生成相應(yīng)的外鍵關(guān)聯(lián),這個(gè)下一節(jié)再介紹。
三、數(shù)據(jù)模型變化的處理
當(dāng)我們的數(shù)據(jù)結(jié)構(gòu)變化了后,就會出現(xiàn)數(shù)據(jù)模型和數(shù)據(jù)庫不一致的情況。此時(shí)運(yùn)行則會出現(xiàn)如下異常:
未經(jīng)處理的異常: System.InvalidOperationException: The model backing the 'BloggingContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
官方給的解決方案如下:Code First Migrations。不過,在開發(fā)過程中,由于數(shù)據(jù)結(jié)構(gòu)變更是很常見的事情,按照這個(gè)方案來未免麻煩了點(diǎn),很多時(shí)候我們是采用一種更加簡單粗暴的做法:
System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
把這句話放在程序的最開始。這樣,一旦檢測到數(shù)據(jù)庫有變更,則會重建整個(gè)數(shù)據(jù)庫。需要注意的時(shí),由于重建數(shù)據(jù)庫會刪除所有的數(shù)據(jù),過于霸氣。因此不要輕易用于正式版本,使用時(shí)最好用DEBUG的宏把它括起來。
四、部署到其它數(shù)據(jù)庫
雖然默認(rèn)情況下會使用LocalDb或SqlExpress創(chuàng)建數(shù)據(jù)庫非常方便,但實(shí)際應(yīng)用中往往會要把它部署到指定的數(shù)據(jù)庫中的,要指定數(shù)據(jù)庫也非常簡單,只需要在app.config中添加配置即可(原來產(chǎn)生的默認(rèn)配置不用處理)。
????<connectionStrings> ? ? ? ? <add ? ? ? ? ? ? name="BloggingContext" ? ? ? ? ? ? providerName="System.Data.SqlClient" ? ? ? ? ? ? connectionString="Server=.\SQLEXPRESS;Database=Products;Trusted_Connection=true;"/> ? ? </connectionStrings>
這里一并給一個(gè)比較常用的MySql連接的示例:
????<connectionStrings> ????????<add?name="BloggingContext"?providerName="MySql.Data.MySqlClient" ? ?? ?? ?? ??connectionString="server=192.168.10.10;User Id=admin;password=test;database=BloggingContext;"?/> ? ??</connectionStrings>
需要注意的是,如果原來的數(shù)據(jù)庫存在的時(shí)候,往往會因?yàn)闅埩舻臄?shù)據(jù)和自動(dòng)映射的不一致而出現(xiàn)無法創(chuàng)建表或其它的異常,最好先把原有的數(shù)據(jù)庫給刪掉。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Entity?Framework代碼優(yōu)先(Code?First)模式
- Entity Framework使用Code First模式管理事務(wù)
- Entity Framework使用Code First模式管理存儲過程
- Entity Framework使用Code First模式管理視圖
- Entity?Framework使用Code?First的實(shí)體繼承模式
- Entity Framework使用Code First模式管理數(shù)據(jù)庫
- EF使用Code First模式生成單數(shù)形式表名
- EF使用Code First模式給實(shí)體類添加復(fù)合主鍵
- 使用EF的Code?First模式操作數(shù)據(jù)庫
- C#筆記之EF Code First 數(shù)據(jù)模型 數(shù)據(jù)遷移
相關(guān)文章
Visual Studio 2017新版發(fā)布 更強(qiáng)大!
Visual Studio 2017新版發(fā)布 更強(qiáng)大!對Visual Studio 2017感興趣的小伙伴們可以參考一下2017-05-05asp.net Linq to Xml學(xué)習(xí)筆記
之前都沒有學(xué)習(xí)過關(guān)于XML文件的操作,由于最近開發(fā)的項(xiàng)目需要用到,開始時(shí)學(xué)習(xí)了原始的XML文件操作方法,看了半天,也看的頭暈眼花,沒學(xué)習(xí)到真正的用法,后來在同事的推薦下學(xué)習(xí)了Linq to Xml2010-03-03.NET運(yùn)行界面上,實(shí)現(xiàn)隨意拖動(dòng)控件的方法
.NET運(yùn)行界面上,實(shí)現(xiàn)隨意拖動(dòng)控件的方法,需要的朋友可以參考一下2013-03-03.NET Core利用swagger進(jìn)行API接口文檔管理的方法詳解
這篇文章主要給大家介紹了關(guān)于.NET Core利用swagger進(jìn)行API接口文檔管理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03Entity?Framework使用DBContext實(shí)現(xiàn)增刪改查
這篇文章介紹了Entity?Framework使用DBContext實(shí)現(xiàn)增刪改查的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10.NET讀寫Excel工具Spire.Xls使用入門教程(1)
這篇文章主要為大家詳細(xì)介紹了.NET讀寫Excel工具Spire.Xls使用入門教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11進(jìn)度條在.net導(dǎo)入Excel時(shí)的應(yīng)用實(shí)例
這篇文章主要介紹了進(jìn)度條在.net導(dǎo)入Excel時(shí)的應(yīng)用,以實(shí)例形式講述了.net導(dǎo)入Excel時(shí)根據(jù)頁面情況顯示進(jìn)度條的實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10asp.net 獲取客戶端瀏覽器訪問的IP地址的實(shí)例代碼
本篇文章主要介紹了asp.net 獲取客戶端瀏覽器訪問的IP地址的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07