DbContext是實體類和數據庫之間的橋梁,DbContext主要負責與數據交互,主要作用:
1、DbContext包含所有的實體映射到數據庫表的實體集(DbSet < TEntity >)。
2、DbContext 將LINQ-to-Entities查詢轉換為SQL查詢並將其發送到數據庫。
3、更改跟蹤: 它跟蹤每個實體從數據庫中查詢出來后發生的修改變化。
4、持久化數據: 它也基於實體狀態執行插入、更新和刪除操作到數據庫中。
DbContext中的DbSet
DbSet表示上下文中指定類型的所有實體的集合或可從數據庫中查詢的指定類型的所有實體的集合。
DbSet常用方法
TestDBContext tdb = new TestDBContext();
Add(Entity)/AddRange | return添加 的Entity |
添加實體到context中,並給實體標記Added狀態 tdb.Persons.Add(entityModel); |
AsNoTracking<Entity> | 獲取一個不被context緩沖和追蹤的序列,多用於只讀序列 var personList = tdb.Persons.AsNoTracking<Person>().ToList<Person>(); |
|
Attach(Entity) | return添加 的Entity |
將實體添加到context上下文中 tdb.Persons.Attach(entityModel); |
Find(int) | return對應id 的Entity |
通過主鍵獲取實體對象,如果在數據庫和context中不存在那么返回null,注:會返回在context中存在但還沒寫入數據庫的實體對象 Person personEntity = tdb.Persons.Find(1); |
Include | include必須是外鍵連接,且立即執行;join連接不需要外鍵,延時執行 var personList = tdb.Persons.Include("PersonName").ToList<Person>(); var personList= tdb.Persons.Include(s => s.PersonName).ToList<Person>(); |
|
Remove/RemoveRange | retrun刪除 的entity |
刪除實例,並給實例對象添加deleted標記 tdb.Persons.Remove(EntityModel); |
SqlQuery | 通過sql獲取實例集合,默認返回的集合是被追蹤的,可以使用AsNoTracking()取消追蹤 var personEntity = tdb.Persons.SqlQuery("select * from T_Person where id = 1").FirstOrDefault<Person>(); |
在EF中實體的五種狀態:
1.detached:實體不在上下文的追蹤范圍內,如剛new的實體,可以通過Attach()添加到上下文,此時狀態為unchanged。
2.unchanged:未改變,如剛從數據庫讀取出來的實體。
3.added:添加狀態,一般執行Add/AddRange時標記為added。因為新對象在數據庫中沒有記錄,所以不能轉為deleted和modified狀態。
4.deleted:刪除狀態,一般執行Remove/RemoveRange時標記為deleted,不能轉換為added狀態。
5.modified:修改狀態,改變了實體的屬性會處於這個狀態,能轉為deleted狀態,不能轉換為added狀態。
EF如何判斷狀態
為當前對象(需要追蹤的)創建一個DbEntityEntry對象,此對象包含:
Current Value(當前值)/Original Value(原始值)/Database Value(數據庫里的值)
只需要比較這三個值,很容易就知道哪些屬性被修改了。
設置context.Configuration.AutoDetectChangesEnabled = false則不會去追蹤,默認是true。
也可以自己指定狀態: