Entity Framework 架構
圖一
圖二
LINQ 分頁
Function GetPaging(index As Integer, size As Integer) As IEnumerable Dim db As New NorthwindEntities() ' 要Skip的筆數 Dim SkipPageSize As Integer = index * size Dim result = (From n In db.Products …).Skip(SkipPageSize).Take(size) Return result End Function
LINQ 是否有資料
If (result.Count() = 0) Then ' 無資料處理 End If
LINQ 預先編譯
' 1.宣告全域變數 ReadOnly cq = System.Data.Objects.CompiledQuery.Compile(Of QnoDCEntities, DateTime, IQueryable(Of Orders))(Function(ctx, orderDate) From o In ctx.Orders Where o.OrderDate < orderDate Order By orderDate Select o) ' Compile(Of 實體, 參數1型別, 參數2型別, … , 參數n, IQueryable(Of 物件)) 參數型別依查詢式所需,可以有多個。 IQueryable(Of 物件)即Data Source。 Function(實體參數, 參數1名稱, 參數2名稱, … , 參數n名稱) From o In DataSource … 此處的DataSource必須與IQueryable(Of 物件)對應 Where … > 參數1名稱 AndAlso ... < 參數2名稱 … 以參數進行過濾 ' 2.主程式 Dim Order = cq.Invoke(QnoDCEntities, orderdate) 傳入實體及參數 ' 可參考:http://msdn.microsoft.com/zh-tw/library/bb896297.aspx
LINQ 之CURD
' LINQ to Entity ' 新增 context.AddTo(EntityClass)(Data) context.SaveChanges() ' 更新 result.欄位 = … context.SaveChanges() ' 刪除 context.DeleteObject(Data) context.SaveChanges() ' Entity Framework 4.1 ' 新增 context.物件.Add(Data) ' 例如: context.Blogs.Add(blog) context.SaveChanges() ' 更新 Dim blog = context.Blogs.Find(id) context.Entry(blog).State = System.Data.EntityState.Modified db.SaveChanges() ' 刪除 Dim blog = context.Blogs.Find(id) db.Entry(blog).State = System.Data.EntityState.Deleted db.SaveChanges()
串連 LINQ
Function Query1(…) As IQueryable(Of …) Return From … In … End Function
Function Query2(Q1 As IQueryable(Of …), …) As IQueryable(Of …) Return From … In Q1 … End Function把Query1當成Query2的Data Source。
LINQ交易
1. SaveChanges() 已預設使用交易。2. 兩個DataContext:使用Explicit交易。
3. 兩個Database:使用TransactionScope交易。
EDM自動跳號
1. Identiry (自動跳號)2. computed ( Insert, Update都會更新),例如,DateTime型別。
關聯載入
1. 預設Lazy Loading (需要時才載入)2. Load() 方法
3. Include(…) 方法
Create Query
方便組裝E-SQL。(Dynamic Query更好)例如,
Dim Rusult = context.CreateQurey(Of …)(“E-SQL”, ObjectParameter(“Name”, …))
Entity Client
用法與SqlClient一樣。EntityClient + E-SQL。
SqlClient + T-SQL。
E-SQL
1. 使用別名。2. Select Value 別名。
Dynamic Query
Dim Result = context.Orders.Where(“it.OrderId = @Id”, New ObjectParameter(“Id”, …))
it是關鍵字。
EDMX 之 POCO
.edmx --> 非POCO,繼承EntityObject --> 序列化(XML)肥大 Web ServiceEF 4.1 --> 轉換為POCO --> 序列化(JSON) --> WCF
DbContext
ASP.NET MVC可使用DbContext。(EF 4.1)' 新增:context.Orders.Add(Data) ' 更新: ' 刪除:context.Orders.Remove(Data) ' 更OOP。
State
改變State可更新、刪除(配合Find())' 找到Data Dim Result = context.Orders.Find(“PK”) context.Entity(…).State=EntityState.{Modified | Deleted} SaveChanges()
批次新增
批次新增可先Disable Changes Trackerdb.Configuration.AutoDetectChangesEnabled = False批次新增完成後,再Enable。
單純Query
單純Query,使用No TrackerDim Result = From o In db.Orders.AsNoTracking() Select o
Local查詢
Local技術,將連線資料處理模式帶到離線資料處理模式。Dim Result = From o In db.Orders.Local Where o.SerialNumber.StartsWith("AK42") Select o
使用T-SQL
' 查詢 Dim Result = db.Orders.SqlQuery("select * from orders") ' 異動 Dim Result = db.Database.ExecuteSqlCommand("Insert ... Value {0}, {1}", 參數1, 參數2)
DbContext使用E-SQL
Dim Result = CType(db, System.Data.Entity.Infrastructure.IObjectContextAdapter) .ObjectContext.CreateQuery("E-SQL")
http://social.msdn.microsoft.com/Forums/zh-TW/238/thread/5b113206-30dd-48ad-b639-270bd12dad34
回覆刪除StoreGeneratedPattern 更新問題,可參考以上回答。