方法1:
新建好項目之后 → 右擊類庫 → 新建項 → ADO.NET實體數據模型(在Visual C#項中) → 從數據庫生成 → 選擇你要映射的數據庫的數據源(將 『是,在連接字符串中包含敏感數據』勾上) → 選中要映射的表、視圖、存儲過程。
下面是使用!
//保證一次請求共用一個上下文實例
var dbContext = DbContextHelper.getCurrentDbContext();

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Web; namespace myWeb { public class DbContextHelper { //保證一次請求共用一個上下文實例 public static MyDbContext getCurrentDbContext() { #region HttpContext方式:內部封裝了CallContext,所以HttpContext方式和CallContext方式差別不大 // //HttpCntext:一次請求,HttpContext已經保證只有一個實例 // MyDbContext dbContext = HttpContext.Current.Items["MyDbContext"] as MyDbContext; // if (dbContext == null) // { //當前Http上下文不存在當前對象 // dbContext = new MyDbContext(); // HttpContext.Current.Items.Add("MyDbContext", dbContext); // } #endregion #region CallContext方式 MyDbContext dbContext = CallContext.GetData("DbContext") as MyDbContext; if (dbContext == null) { dbContext = new MyDbContext(); CallContext.SetData("DbContext", dbContext); } #endregion return dbContext; } } /// <summary> /// 這里的MyDbCotext類只是打一個比方,實際在用的時候需要更改成項目所需要用的實體類 /// </summary> public class MyDbContext { } }
//1、聲明一個EF的上下文 MyTestEntities1 dbcontext = new MyTestEntities1(); //dbcontext.Database.Connection.ConnectionString = "";//重新設置數據庫連接字符串(對於非常重要數據庫,如銀行的賬號密碼等,需要對數據庫字符串進行密鑰加密的,可以在這里解密后重新賦值)

//2、聲明一個User實體 //USERS user = new USERS(); //user.NAME = "vichin"; //user.SEX = "男"; //user.DATE = "19921126"; //user.ID = 4; //user.NUMBER = 4; //3、告訴EF,咱們對實體的做一個插入操作 //dbcontext.USERS.Add(user); //3、告訴EF,咱們對實體的做一個刪除操作 //dbcontext.USERS.Remove(user);

//2、聲明一個實體 USERS user = new USERS(); user.SEX = "男"; user.NAME = "vichin"; user.DATE = "19861112"; user.ID = 4; //3、告訴上下文咱們要對此實體進行更新操作 #region 對一整行數據進行更行 dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;//要做刪除的話,只需要將modified改寫成Deleted #endregion #region 對一行數據中,某個字段進行更新 dbcontext.USERS.Attach(user);//將新的user對象附加到上下文中來,進行管理 dbcontext.Entry<USERS>(user).Property<string>(u => u.NAME).IsModified = true; // EF5.0之后的寫法(VS2012開始使用) dbcontext.Entry<USERS>(user).Property("NAME").IsModified = true;//EF4.0的寫法(VS2010中的寫法) #endregion
//4、告訴上下文把實體的變化保存到數據庫(執行SQL腳本) dbcontext.SaveChanges();

//使用查詢語法 var temp = from u in dbcontext.USERS where u.ID == 4 select u; //查詢部分列 var data = from u in dbcontext.USERS select new { u.ID, u.NAME, u.SEX, u.NUMBER }; //使用方法語法 var temp2 = dbcontext.USERS.Where(u => u.ID == 4); //查詢部分列 var data1 = dbcontext.USERS.Where(u => u.ID == 4).Select(u=>u.ID); var data2 = dbcontext.USERS.Where(u => u.ID == 4).Select(u => new { u.ID,u.NAME,u.NUMBER}); //IQueryable<USERS> temp1 = from u in dbcontext.USERS // where u.ID == 4 // select u; //上面是在數據庫中做了篩選之后才放到內存中的 //linq to object 將數據庫的數據全都放到內存中 //var temp1 = from u in dbcontext.USERS.ToList() //where u.ID == 4 //select u; #region 分頁 var pageData = dbcontext.USERS.Where(u => u.ID > 0).OrderBy<USERS, int>(u => u.ID); //int <==> ID 根據ID來排序,所以在OrderBy后面的泛型約束中TKey 使用int(因為ID是int類型的) var pageData1 = dbcontext.USERS.Where(u => u.ID > 0).OrderBy<USERS, string>(u => u.NAME); //在實際使用中,可以將orderBy后面的泛型約束給省略掉: var pageData2 = dbcontext.USERS .Where(u => u.ID > .0) .OrderBy(u => u.NAME) // 每頁5條,要取第三頁的數據。從第10條數據開始取5條數據 .Skip(5*(3-1))//越過多少條數據呢? 越過前2頁的數據 .Take(5);//取5條 //使用查詢語法做分頁 var pageData3 = (from u in dbcontext.USERS where u.ID > 0 orderby u.ID descending select u).Skip(10).Take(5); //還是要用到skip take #endregion
在對數據庫進行刪除、更新操作時,一定要將所有的非空字段(實體的屬性)賦值,即使在更新的時候用不到那個字段,也得賦值。
方法二:
1、在VS中創建數據庫
點擊 view(視圖)→sql server對象資源管理器(或者叫數據庫資源管理器database Explorer)→在SQL 對象資源管理器中右擊Sql Server→添加Sql server.之后再創建的Sql server對象中添加database 和 表(此處以Products為例),並在表中添加一些測試數據。
2、創建數據模型
數據模型類名為Product
3、添加EF 並創建EF上下文
install-package entity framework -version5.0
namespace SportsStore.Models.Repository{
public class EFDbContext:DbContext{
public DbSet<Product> Products{get;set;}// Products與表名Products相同,表中每一行數據都用Product來表示
}
}
在web.config文件中ConfigSections節點后添加數據庫連接字符串

<connectionStrings> <add connectionString="Data Source=RY4H4GAGMN6Y5LN;Initial Catalog=SportsStore;Integrated Security=True" name="EFDbContext" providerName="System.Data.SqlClient"/> </connectionStrings>
4、在倉儲層中創建一個存儲庫類,它將對前面創建的EFDbContext類執行操作,並作為應用程序業務邏輯與數據庫之間的“橋梁”。
namespace SportsStore.Models.Repository{
public class Repository{
EFDbContext context=new EFDbContext ();
public IEnumber<Product> Products{get{return context.Products;}}
}
}
5、使用(只要創建倉儲層對象就可以使用了)
Repository repo=new Repository();
repo.Products
當數據庫內的表或者字段發生變化時,就會報以下錯誤:
The model backing the 'EFDbContext' context has changed since the database was created. Consider ....
最直接的方式是刪除VS中的數據庫,並且重新添加。
linqpad官網: http://www.linqpad.net/
下面是常見錯誤(部分)
報錯: Unable to update the EntitySet 'USERS' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.
報錯:從 ObjectStateEntry 中檢索值時出錯。有關詳細信息,請參閱內部異常。
原因:報這個錯的原因是表中沒有主鍵!
————————————————————————————————————————————
代碼:dbcontext.Entry<USERS>(user).State = System.Data.EntityState.Modified;
報錯:無法將類型"System.Data.EntityState"隱式轉換為"System.Data.Entity.EntityState"
原因:這行代碼是EF5.0中的寫法,如果用的是6.0則需要寫成
dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;
————————————————————————————————————————————
報錯:對一個或多個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性。
原因:實體的非空屬性沒有全部都被賦值,或者是數據的長度超過了定義的類型 (NVARCHAR 100)
————————————————————————————————————————————
報錯:存儲區更新、插入或刪除語句影響到了意外的行數(0)。實體在加載后可能被修改或刪除。刷新 ObjectStateManager項
原因:要操作的數據在數據庫並不存在。(例如:要刪除一個ID為9999的數據,可是當前數據庫中並沒有ID為9999的數據)
—————————————————————————————————————————————————————————————————————————EF優缺點
優點:
1、極大提高開發效率,與VS的開發工具集成度高,開發中沒,代碼幾乎都是強類型的,寫代碼效率高,自動化程度高,命令式編程。
2、EF提供的模型設計器非常強大,不僅僅帶來了設計數據庫的革命,也帶來了自動化生成模型代碼的功能,極大提高了開發與架構設計的效率。
3、僅僅通過改變配置,就可以做到誇數據庫的能力。
缺點:
性能差(在生成SQL腳本階段),在復雜查詢的時候,生成的SQL腳本效率不高。
1、根據XML映射關系及實體的狀態生成相應的腳本(相對於SQL語句在數據庫中執行的速度來說是慢的,所以在做互聯網項目的時候不推薦使用EF,而在做企業級開發的時候,可以使用。)
2、不在數據端額外的消耗性能