前言sql
首先來簡單的複習一下如何使用Code First。數據庫
第一步仍是先創建一個控制檯的應用程序,而後經過Nuget添加Entity Framework。那麼同時會給packages.config和App.config添加相應的配置。ide
第二步添加一個數據操做上下文實體類。添加兩個構造函數,並添加一個Person的實體類。 在App.config的配置文件中添加相應的數據連接配置。函數
第三步在調用便可生成相應的數據庫。測試
EFContext.csui
public class EFContext:DbContext { public EFContext() : base("EFContext") { } public EFContext(string connectionstring) :base(connectionstring) { } public DbSet<Person> Persons { get; set; } }
App.config編碼
<?xml version="1.0" encoding="utf-8"?> <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=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="EFContext" connectionString="Data Source=.;Database=EFContext;UID=sa;PWD=sa123;" providerName="System.Data.SqlClient"></add> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> </entityFramework> </configuration>
package.config spa
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="EntityFramework" version="5.0.0" targetFramework="net45" /> </packages>
而後簡單的添加了一個實體類code
public class Person { public int PersonId { get; set; } public string PersonName { get; set; } public int Age { get; set; } public string Address { get; set; } public string Email { get; set; } }
最終進行調用orm
static void Main(string[] args) { using (var db = new EFContext("EFContext")) { var persons = db.Persons.Where(t => t.PersonName == "aehyok").OrderByDescending(t => t.PersonId).ToList(); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine(); }
運行後控制檯沒有數據顯示,可是在數據庫裏能夠查看到相應的數據庫EFContext和數據表People。
如今咱們經過數據庫直接爲上面創建的數據庫EFContext中的People表手動添加了幾條數據。
而後從新運行程序。能夠發現有數據了。
此時能夠發現咱們的第一個簡答的查詢語句已經實現了。
一個數據庫上下文的生命週期隨着該對象的建立而開始,隨着對象的釋放(或GC回收)而結束,所以建議在開發過程當中使用「Using」編碼方式,這樣就能夠免去手動釋放對象的操做。另外對於數據庫鏈接的管理在EF中是透明的,咱們通常不須要手動進行處理,當查詢一個對象時打開鏈接當處理完查詢的結果集以後會自動關閉鏈接。
Linq To Entity表達式查詢
查詢表達式是C#3.0新增的功能,它是由一組相似於T-SQL或XQuery聲明性語句組成,CLR並不能直接讀取這種查詢表達式而是在編譯時轉換爲對應的方法調用。以下面的例子:
using (var db = new EFContext("EFContext")) { var persons = from p in db.Persons where p.PersonName == "aehyok" orderby p.PersonId descending select p; foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine();
獲得的結果同上面是一致的。
基於方法的查詢
基於方法的查詢事實上是一組對象的擴展方法,同Linq查詢不一樣的是這些方法能夠直接被CLR識別並運行。
例如上面的方法咱們能夠轉換爲以下代碼,他們的效果是同樣的,返回的都是「IQueryable」對象,這裏的代碼其實也就是咱們開始爲建立數據庫測試的代碼
using (var db = new EFContext("EFContext")) { var persons = db.Persons.Where(t => t.PersonName == "aehyok").OrderByDescending(t => t.PersonId).ToList(); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine();
固然執行的結果仍是同樣的。
原生SQL的查詢
EF還支持原生SQL查詢, 在DataBase上的SQlquery使你可以執行sql返回任意類型的數據,例如:
using (var db = new EFContext("EFContext")) { var persons = db.Persons.SqlQuery("select * from EFContext..People where PersonName='aehyok'"); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine();
能夠直接經過SQL語句的拼接額,固然這裏只是作了最簡單的實例。
不只如此,EF還支持非實體類型的查詢:
using (var db = new EFContext("EFContext")) { var persons = db.Database.SqlQuery<string>("select PersonName from EFContext..People where PersonName='aehyok'"); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} ", p); } }
使用DataBase的ExecuteSqlCommand去更新數據:
using (var db = new EFContext("EFContext")) { var persons = db.Database.ExecuteSqlCommand("update EFContext..People set Address='中國' where PersonName='aehyok'"); }
使用ExecuteSqlCommand 或者SqlQuery直接指定存儲過程:
context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").