entityframework作為.net平臺自己的一個orm的框架,之前在項目中也有使用,主要採用了table和model first的方式,此兩種感覺使用上也是大同小異。在項目中經常反應的一個問題源於多個開發團隊共用一個資料庫(3個開發團隊使用同一個資料庫,開發的是一個平臺的各個業務場景),因而 ...
- 現階段使用回溯
entityframework作為.net平臺自己的一個orm的框架,之前在項目中也有使用,主要採用了table和model first的方式,此兩種感覺使用上也是大同小異。在項目中經常反應的一個問題源於多個開發團隊共用一個資料庫(3個開發團隊使用同一個資料庫,開發的是一個平臺的各個業務場景),因而如在開發庫(且記為19)A Team的 Lee 同學,修改了某表的欄位,開發過程中 B Team某業務的項目使用EF架構,開發同學 Yang 在開發庫上更新了整個table到model的映射,之後繼續使用linq方式進行業務處理,一切沒有問題,之後開髮結束,提交代碼構建到beta環境提交測試(測試環境並未A B Team共用,此為B Team的測試環境)此時因為A Team的 Lee 同學的腳本實際上是沒有在beta資料庫執行的,而程式已經更新過了,這樣子就產生程式出錯。實際上這理應屬於管理問題,具體是sql腳本的管理規範,所以針對多團隊的協作使用同一DB的情況下需要約定要麼一個人負責DB的許可權,或者共用一個sql script的腳本目錄,任何資料庫腳本,需即時更新進去,在構建或者發佈動作保證同時對sql script進行execute(目前在trunk建立了sql script的共用目錄以供此操作)。
2. 使用table first的方式創建演示項目
1) 創建演示資料庫 EFTableModel,並創建演示對象。
1 use EFTableModel 2 go 3 create table Users( 4 id int primary key, 5 username nvarchar(40) 6 ) 7 go 8 IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Users_view') 9 DROP VIEW Users_view 10 GO 11 CREATE VIEW Users_view 12 AS 13 SELECT * FROM Users 14 GO 15 SELECT * FROM Users_view 16 go 17 create proc proc_users 18 as 19 select * from Users_view 20 go 21 exec proc_usersView Code
2) 創建演示項目,並建立table first 的基本映射模型
新建web項目,使用framework4.5
選擇mvc,並設置 無身份驗證
新建 ado.net 實體數據模型
選擇從table生成,即為table first模式
設置連接資料庫
選擇映射模型的包含對象
如下,即為現下 table first 映射出的 model
3. 添加 mvc5 controller,進行資料庫操作。
預設controller已經生成如下的示例代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Data.Entity; 5 using System.Linq; 6 using System.Net; 7 using System.Web; 8 using System.Web.Mvc; 9 using EFTableModelApplication.Models; 10 11 namespace EFTableModelApplication.Controllers 12 { 13 public class UserController : Controller 14 { 15 private EFTableModelEntities db = new EFTableModelEntities(); 16 17 // GET: /User/ 18 public ActionResult Index() 19 { 20 return View(db.Users.ToList()); 21 } 22 23 // GET: /User/Details/5 24 public ActionResult Details(int? id) 25 { 26 if (id == null) 27 { 28 return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 29 } 30 Users users = db.Users.Find(id); 31 if (users == null) 32 { 33 return HttpNotFound(); 34 } 35 return View(users); 36 } 37 38 // GET: /User/Create 39 public ActionResult Create() 40 { 41 return View(); 42 } 43 44 // POST: /User/Create 45 // 為了防止“過多發佈”攻擊,請啟用要綁定到的特定屬性,有關 46 // 詳細信息,請參閱 http://go.microsoft.com/fwlink/?LinkId=317598。 47 [HttpPost] 48 [ValidateAntiForgeryToken] 49 public ActionResult Create([Bind(Include="id,username")] Users users) 50 { 51 if (ModelState.IsValid) 52 { 53 db.Users.Add(users); 54 db.SaveChanges(); 55 return RedirectToAction("Index"); 56 } 57 58 return View(users); 59 } 60 61 // GET: /User/Edit/5 62 public ActionResult Edit(int? id) 63 { 64 if (id == null) 65 { 66 return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 67 } 68 Users users = db.Users.Find(id); 69 if (users == null) 70 { 71 return HttpNotFound(); 72 } 73 return View(users); 74 } 75 76 // POST: /User/Edit/5 77 // 為了防止“過多發佈”攻擊,請啟用要綁定到的特定屬性,有關 78 // 詳細信息,請參閱 http://go.microsoft.com/fwlink/?LinkId=317598。 79 [HttpPost] 80 [ValidateAntiForgeryToken] 81 public ActionResult Edit([Bind(Include="id,username")] Users users) 82 { 83 if (ModelState.IsValid) 84 { 85 db.Entry(users).State = EntityState.Modified; 86 db.SaveChanges(); 87 return RedirectToAction("Index"); 88 } 89 return View(users); 90 } 91 92 // GET: /User/Delete/5 93 public ActionResult Delete(int? id) 94 { 95 if (id == null) 96 { 97 return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 98 } 99 Users users = db.Users.Find(id); 100 if (users == null) 101 { 102 return HttpNotFound(); 103 } 104 return View(users); 105 } 106 107 // POST: /User/Delete/5 108 [HttpPost, ActionName("Delete")] 109 [ValidateAntiForgeryToken] 110 public ActionResult DeleteConfirmed(int id) 111 { 112 Users users = db.Users.Find(id); 113 db.Users.Remove(users); 114 db.SaveChanges(); 115 return RedirectToAction("Index"); 116 } 117 118 protected override void Dispose(bool disposing) 119 { 120 if (disposing) 121 { 122 db.Dispose(); 123 } 124 base.Dispose(disposing); 125 } 126 } 127 }View Code
可以看到,至此沒有手工書寫任何代碼層面的東西,完全自動集成,就可以使用EFTableModelEntities對象實例直接操作各個數據表。
最後訪問,http://localhost:63790/user,已經內置了基本crud操作。
3. 使用 table first 方式 從資料庫 更新 model
首先執行以下腳本,即增加User表一個salary欄位:
1 use EFTableModel 2 alter table Users add salary money 3 goView Code
在設計界面,右鍵,選擇 從資料庫更新模型,進行數據模型的更新。
更新結束之後,結果如下圖所示:
修改index視圖:
代碼:
1 @model IEnumerable<EFTableModelApplication.Models.Users> 2 3 @{ 4 ViewBag.Title = "Index"; 5 } 6 7 <h2>Index</h2> 8 9 <p> 10 @Html.ActionLink("Create New", "Create") 11 </p> 12 <table class="table"> 13 <tr> 14 <th> 15 @Html.DisplayNameFor(model => model.username) 16 </th> 17 <th> 18 @Html.DisplayNameFor(model => model.salary) 19 </th> 20 <th></th> 21 </tr> 22 23 @foreach (var item in Model) { 24 <tr> 25 <td> 26 @Html.DisplayFor(modelItem => item.username) 27 </td> 28 <td> 29 @Html.DisplayFor(modelItem => item.salary) 30 </td> 31 <td> 32 @Html.ActionLink("Edit", "Edit", new { id=item.id }) | 33 @Html.ActionLink("Details", "Details", new { id=item.id }) | 34 @Html.ActionLink("Delete", "Delete", new { id=item.id }) 35 </td> 36 </tr> 37 } 38 39 </table>View Code
再次查看列表頁面,顯示正常:
4. ef架構模型及C-S mapping(ConceptualModels-StorageModels)