Entity Framework 是微軟以 ADO.NET 爲基礎所發展出來的對象關係對應 (O/R Mapping) 解決方案
對象關係映射(英語:Object Relational Mapping,簡稱ORM),是一種程序技術,用於實現面向對象編程語言裏不一樣類型系統的數據之間的轉換。sql
下載: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下載。分佈式
鏈接ide
能夠直接用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