ef

来源:http://www.cnblogs.com/yhcelebrite/archive/2016/05/17/yhcelebrite_ef.html
-Advertisement-
Play Games

entityframework作為.net平臺自己的一個orm的框架,之前在項目中也有使用,主要採用了table和model first的方式,此兩種感覺使用上也是大同小異。在項目中經常反應的一個問題源於多個開發團隊共用一個資料庫(3個開發團隊使用同一個資料庫,開發的是一個平臺的各個業務場景),因而 ...


  1. 現階段使用回溯

  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_users
View 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 go
View 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)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在早期學習c#的過程中,經常遇到這樣的語句: public string StudentName { get{return stuName;} set{stuName=value;} } 當時也不是很明白為什麼要這樣?學深了c#後,又沒法對其做一個總結。今天看了《Visual c#.net程式設計教 ...
  • 只能輸入數字onkeyup='this.value=this.value.replace(/\D/gi,"")'限制文本框只能輸入正數,小數onkeyup="value=value.replace(/[^\d.]/g,'')" 只能輸入正數 負數 小數onkeyup="value=value.rep ...
  • ![圖片來自網路/圖文無關][0] 前言 今天接到領導佈置的一個任務,是之前同事負責的項目。離職了,現在客戶有些地方需要修改,由於我之前參與過,就落在我的頭上了。 然後我就把代碼弄了過來,打開發現其中需要用到水晶報表。(我覺得不好用,不想占用多餘的磁碟空間,就沒有安裝) 想想算了,大不了重新添加一下 ...
  • 一個列表頁面不止是查詢,它也包含了很多業務上功能的實現,這些業務功能的實現的邏輯我稱之為動作。如觸發單擊按鈕刪除數據,更改業務表數據,調用webService,調用WCF介面,彈出新窗體新增、修改、查看數據,根據列表數據顯示行的顏色等等這些我都稱為動作。動作的實現有兩類:第一類編碼實現,第二類利用通 ...
  • 1.項目右鍵-添加 新建項目 重新生成: 引用-新建引用 引入命名空間: ...
  • controller: ,view: 效果圖: ...
  • 資料庫設計 sql語句: ...
  • ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。 ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程式的新起點,它旨在成為一個通用的WEB應用程式框架和項目模板。 ASP.NET Boilerplate 基於DD ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...