Entity Framework 是微軟以 ADO.NET 為基礎所發展出來的對象關系對應 (O/R Mapping) 解決方案
對象關系映射(英語:Object Relational Mapping,簡稱ORM),是一種程序技術,用於實現面向對象編程語言里不同類型系統的數據之間的轉換。
下載:Install-Package EntityFramework -Version 6.1.3 (7.0只有CodeOnly模式)
本節技術概覽:數據庫的安裝,DB First,Model First,Code First(重點),DbContext,DbSet,CRUD例子,數據遷移以及事務管理。
LocalDb是visual studio自帶的,用來開發使用。運行是采用進程形式而非服務形式。
位置:C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe(這是vs 2013的位置,使用VS2013開發人員工具輸入sqllocaldb即可)
SQL Server采用服務方式,方便連接管理。可以去itellyou.cn下載。
連接
可以直接用vs連接這2種數據庫。連接localdb


DB First采用通常的數據庫先行的辦法,常見,穩定。基本下一步下一步就能完成。
Model First在VS中 畫模型圖,來生成數據庫和Object,不方便控制數據庫。
這2個都會產生edmx文件(xml),包含SSDL(數據定義),CSDL(類定義),CS Mapping(數據類映射)
在edmx模型查看中,不會把所有表都顯示。當2個表的關系為多對多的時候,關系表會由一條多對多的線來表示。
在Model Browser中,可以看到存儲過程,視圖等非表的信息。
在EF7中,只有Code Only 說明Code First的重要性。在使用中,中小型項目,我也推薦使用,畢竟開發效率提高了不止一點點。
創建POCO
public class App
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<AppData> AppDatas { get; set; }
}
public class AppData
{
public int Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public virtual App App { get; set; }
}
創建DbContext
public class AppContext : DbContext
{
public AppContext()
: base("AppDb") //AppDb數據庫庫名
{
}
public DbSet<App> Apps { get; set; }
public DbSet<AppData> AppDatas { get; set; }
}
文件結構:

app.config
<configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> </configuration>
Main方法
static void Main(string[] args)
{
using (var ctx = new AppContext())
{
var app = new App() { Name = "博客園" };
var data = new[]
{
new AppData() {Name = "最新博客", Value = "XX", App = app},
new AppData() {Name = "48小時閱讀排行", Value = "YY", App = app}
};
ctx.Apps.Add(app);
ctx.AppDatas.AddRange(data);
ctx.SaveChanges();
}
}
連接數據庫,查看數據庫。

在EF中,DbContext相當於一個數據庫,DbSet則相當於一個數據表或者視圖。
當業務改變,POCO類需要改變,表也需要改變。
EF的數據遷移通過 NuGet 來進行。
打開程序包管理器控制台(Package Manager Console),鍵入“get-help EntityFramework”命令,可以獲得相關的幫助信息。
Enable-Migrations [-Force]
Add-Migration
Update-Database
Get-Migrations
如:加一個Title屬性
public class App
{
public int Id { get; set; }
public string Name { get; set; }
public string Title { get; set; } //add prop
public virtual ICollection<AppData> AppDatas { get; set; }
}
啟動遷移功能

文件結構

生成改變

如果覺得太麻煩,可以使用以下方式
public class AppContext : DbContext
{
public AppContext()
: base("AppDb") //AppDb數據庫庫名,也可以換成連接字符串
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AppContext>());
}
public DbSet<App> Apps { get; set; }
public DbSet<AppData> AppDatas { get; set; }
}
using (var ctx = new AppContext()) { //crud #region create var app = new App() { Name = "博客園" }; var data = new[] { new AppData() {Name = "最新博客", Value = "XX", App = app}, new AppData() {Name = "48小時閱讀排行", Value = "YY", App = app} }; ctx.Apps.Add(app); ctx.AppDatas.AddRange(data); ctx.SaveChanges(); #endregion #region update app.Name = "Never、C"; ctx.SaveChanges(); //or ctx.Apps.AddOrUpdate(app); #endregion #region read app = ctx.Apps.FirstOrDefault(o => o.Name == "博客園"); Console.WriteLine(app); #endregion #region delete ctx.Apps.Remove(app); #endregion }
對於一個ORM框架,支持事務操作是必須的。
我們的每一次SaveChanges就是一個事務操作,只需要在所有更改都完成后,調用這個方法就可以了。
如果你不願意,可以手動的開啟事務的代碼 :
DbConnection con = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
con.Open();
using (var tran = con.BeginTransaction())
{
// 這里才是事務中的代碼
tran.Commit();
}
con.Close();
以上是針對一個DbContext,也就是一個數據庫的時候,如果操作涉及到多個數據庫,還是使用分布式事務操作比較靠譜。
使用分布式事務處理,需要Windows系統的支持,所以,我們需要將系統的MSDTC服務開啟。
代碼下載:EFTest.zip
