MVC5+EF6 入門完整教程4 :EF基本的CRUD
上篇文章主要講了如何配置EF, 我們回顧下主要過程:
建立Data Model à 建立Database Context à建立databaseInitializerà配置entityFramework的context配置節。
對這個過程還有疑問的可以去上篇再看一下。
本次我們就主要講解 (1) EF基本的CRUD (2) 涉及到的常用HtmlHelper
文章提綱
概述 & 要點
理論基礎
詳細步驟
總結
概述 & 要點
下面是本文要點,正文部分會有詳細介紹。
- EF資料模型的CRUD
- 常用的HtmlHelper
- Repository Pattern
理論基礎 -- EF 三種程式設計方式 (略)
總共有三種方式:
Database First,Model First和Code First,我們採用的是code first.
這方面資料很多,我就不重複講述了, 需要了解這三者差異和應用場景的請自行查閱其他資料。
理論基礎 -- EF CRUD
針對之前建立的SysUser, SysRole, SysUserRole舉一些典型例子,基本的CRUD大家在使用時模仿這些例子就可以了。
我們要用的資料庫示例資料分別如下:
SysUser
SysRole
SysUserRole
EF資料查詢
先講使用頻率最高的查詢部分。
EF資料查詢用LINQ實現(LINQ to Entities),通常有表示式和函式式兩種方式。建議用函式式方式,比較簡單。
假設我們已經定義好了context
private AccountContext db = new AccountContext();
- [基本查詢] 查詢所有的SysUser
var users = from u in db.SysUsers
select u; //表示式方式
users = db.SysUsers; //函式式方式
- [條件查詢] 加入查詢條件
users = from u in db.SysUsers
where u.UserName == "Tom"
select u; //表示式方式
users = db.SysUsers.Where(u => u.UserName == "Tom");
NOTE 注意這邊等號是C#寫法 : " == "
- [排序和分頁查詢]
users = (from u in db.SysUsers
orderby u.UserName
select u).Skip(0).Take(5); //表示式方式
users = db.SysUsers.OrderBy(u => u.UserName).Skip(0).Take(5); //函式式方式
NOTE 只有排序了才能分頁
- [聚合查詢]
//查user總數
var num = db.SysUsers.Count();
//查最小ID
minId = db.SysUsers.Min(u => u.ID);
NOTE 聚合查詢只能通過函式式查詢
- [連線查詢]
var users = from ur in db. SysUserRoles
join u in db. SysUsers
on ur.SysUserID equals u.ID
ur;
NOTE
大家注意,連線查詢返回的結果還是一個型別為SysUserRoles的集合,只是用
了內連線進行了的篩選。
那麼問題來了,如果我需要選擇一個集合,裡面包括多張表,如SysUser裡面的UserName和SysRole裡面的RoleName怎麼辦?
這個是通過navigation property來實現的, 前面新建model的時候提到過,例如SysUser裡面的
public virtual ICollection<SysUserRole> SysUserRoles { get; set; }
但這種做法還是不是太靈活,具體做法我們在下面的詳細步驟裡面講。
EF資料更新
UPDATE步驟比較清晰,直接看下面程式碼。
//資料更新,分三步:找到物件--> 更新物件資料--> 儲存更改
public ActionResult EFUpdateDemo()
{
//1.找到物件
var sysUser = db.SysUsers.FirstOrDefault(u => u.UserName == "Tom");
//2.更新物件資料
if (sysUser != null)
{
sysUser.UserName = "Tom2";
}
//3.儲存修改
db.SaveChanges();
return View();
}
EF資料新增/刪除
與UPDATE類似。
//資料新增和刪除
public ActionResult EFAddOrDeleteDemo()
{
//新增
//1.建立新的實體
var newSysUser = new SysUser()
{
UserName = "Scott",
Password = "tiger",
Email = "[email protected]"
};
//2.增加
db.SysUsers.Add(newSysUser);
//3.儲存修改
db.SaveChanges();
//刪除
//1.找到需要刪除的物件
var delSysUser = db.SysUsers.FirstOrDefault(u => u.UserName == "Scott");
//2.刪除
if (delSysUser!=null)
{
db.SysUsers.Remove(delSysUser);
}
//3.儲存修改
db.SaveChanges();
return View("EFQueryDemo");
}
詳細步驟
- 查詢使用者及相應角色的功能
- 修改使用者
- 增加使用者和刪除使用者
查詢使用者及相應的角色
- 在Controller中修改Index方法,新增相關View, 顯示所有使用者
- 將model作為引數傳過去
- Views à Account à Index.cshtml 頂部新增強型別宣告,
@model IEnumerable<MVCDemo.Models.SysUser>
body中添加個table用來顯示資料
NOTE
@Html.ActionLink("Details", "Details", new { id = item.ID })生成一個相同controller下的路由地址。
顯示結果
- 增加一個Details方法,新增相關View, 顯示相應使用者及對應的角色
- 將特定的model傳過去
- Views à Account à Index.cshtml 頂部新增強型別宣告
@model MVCDemo.Models.SysUser
顯示資料,注意方框部分如何導航到另外一張表的資訊中。
顯示結果
更新使用者,增加使用者,刪除使用者
這三個操作都類似,屬於更新的範疇,我們放在一起來講。
- 修改Views à Account à Index.cshtml
開頭增加Create連結。
table每條記錄後面增加Edit,Delete連結。
- 在Controller中增加相應的方法。
新建使用者:
//新建使用者
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(SysUser sysUser)
{
db.SysUsers.Add(sysUser);
db.SaveChanges();
return RedirectToAction("Index");
}
修改使用者:
//修改使用者
public ActionResult Edit(int id)
{
SysUser sysUser = db.SysUsers.Find(id);
return View(sysUser);
}
[HttpPost]
public ActionResult Edit(SysUser sysUser)
{
db.Entry(sysUser).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
刪除使用者:
//刪除使用者
public ActionResult Delete(int id)
{
SysUser sysUser = db.SysUsers.Find(id);
return View(sysUser);
}
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
SysUser sysUser = db.SysUsers.Find(id);
db.SysUsers.Remove(sysUser);
db.SaveChanges();
return RedirectToAction("Index");
}
NOTE
涉及到資料更新的地方都有兩個同名的方法過載,一個用來顯示[HttpGet],一個用來資料更新[HttpPost]
- 在右鍵方法名,生成相應的View
每個View的頂部需要新增一個宣告
@model MVCDemo.Models.SysUser
各個view的body中具體程式碼:
Create.cshtml
<body>
<div>
<h2>Create</h2>
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(model => model.UserName)
@Html.EditorFor(model => model.UserName)
</div>
<div>
@Html.LabelFor(model => model.Email)
@Html.EditorFor(model => model.Email)
</div>
<div>
@Html.LabelFor(model => model.Password)
@Html.PasswordFor(model => model.Password)
</div>
<div>
<input type="submit" value="Create" />
</div>
}
<div>@Html.ActionLink("Back to List","Index")</div>
</div>
</body>
Edit.cshtml
<body>
<div>
<h2>Edit</h2>
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.ID)
<div>
@Html.LabelFor(model => model.UserName)
相關推薦
MVC5+EF6 入門完整教程4 :EF基本的CRUD
上篇文章主要講了如何配置EF, 我們回顧下主要過程:建立Data Model à 建立Database Context à建立databaseInitializerà配置entityFramework的context配置節。對這個過程還有疑問的可以去上篇再看一下。本次我們就主
MVC5+EF6 入門完整教程6 :分部檢視(Partial View)
Partial/RenderPartial和Action/RenderAction的引數分別是 partialView和 Action的名字。當然還有其他的過載函式,我們只說最常用的。應用時可以按照我們前面舉的例子。
MVC5+EF6 入門完整教程2 :從前端UI開始
從前端的UI開始MVC分離的比較好,開發順序沒有特別要求,先開發哪一部分都可以,這次我們主要講解前端UI的部分。ASP.NET MVC拋棄了WebForm的一些特有的習慣,例如伺服器端控制元件,ViewState這些東西,讓Web迴歸原始的狀態,Web是什麼樣子就是什麼樣子。
MVC5+EF6 入門完整教程九
taf bag details 視圖 clu role pre 階段 驗證 前一陣子臨時有事,這篇文章發布間隔比較長,我們先回顧下之前的內容,每篇文章用一句話總結重點。 文章一 MVC核心概念簡介,一個基本MVC項目結構 文章二 通過開發一個最基本的登錄界面,介紹了如何從C
MVC5+EF6 入門完整教程12--靈活控制Action權限
全局 基本功 -1 str 條件 context tac 完整 suse 大家久等了。 本篇專題主要講述MVC中的權限方案。 權限控制是每個系統都必須解決的問題,也是園子裏討論最多的專題之一。 前面的系列文章中我們用到了 SysUser, SysRole, SysUserR
MVC5+EF6 入門完整教程七
好的 ring 改變 替換 使用 需要 註釋 mod num 本篇我們針對表格顯示添加一些新功能。 前面我們已經講解過表格顯示數據了,現在我們添加三個常用功能: 對顯示結果進行排序、過濾、分頁。 文章提綱 理論基礎/前置準備 詳細步驟 總結 前置準備 – 應
MVC5+EF6 入門完整教程十
crud 新建 用戶角色 tro mic acc where shtml pos 本篇是第一階段的完結篇。 學完這篇後,你應該可以利用MVC進行完整項目的開發了。 本篇主要講述多表關聯數據的更新,以及如何使用原生SQL。 文章提綱 多表關聯數據更新 如何使用原生SQ
MVC5 + EF6 入門完整教程一
第0課 從0開始 ASP.NET MVC開發模式和傳統的WebForm開發模式相比,增加了很多"約定"。 直接講這些 "約定" 會讓人困惑,而且東西太多容易忘記。 和微軟官方教程不同,筆者儘量不用腳手架,從空白框架開始,一步一步新增功能,每次新增的東西剛好夠用,讓大
MVC5+EF6 入門完整教程八
本篇是相對獨立的一篇,主要講解不丟失資料進行資料庫結構升級。 前面我們講解EF功能時(見第三篇文章)已經介紹過一種更新資料庫的方式: EF比較model和database,如果兩邊不一致,程式將會drop and re-create資料庫。 本篇文章我們會使用 co
MVC5 + EF6 入門完整教程 四
上篇文章主要講了如何配置EF, 我們回顧下主要過程: 建立Data Model à 建立Database Context à建立databaseInitializerà配置entityFramework的context配置節。 對這個過程還有疑問的可以去上篇再看一下。 本次我們就主要講解 (1)
MVC5+EF6 入門完整教程11--細說MVC中倉儲模式的應用
http://www.cnblogs.com/miro/p/4806199.html 摘要: 第一階段1~10篇已經覆蓋了MVC開發必要的基本知識。 第二階段11~20篇將會側重於專題的講解,一篇文章解決一個實際問題。 根據園友的反饋, 本篇文章將會先對呼聲最高
MVC5+EF6 入門完整教程五
上篇文章介紹了EF實現CRUD及一些基本的Html Helpers. 這次我們將會對之前的內容進行一些修改和重構: 引入Bootstrap樣式,搭建幾類共用的模板頁,對UI進行一些改造 分類介紹Html Helpers 完善一些功能 文章提綱 理論基礎
MVC5+EF6 入門完整教程12--靈活控制Action許可權
大家久等了。 本篇專題主要講述MVC中的許可權方案。 許可權控制是每個系統都必須解決的問題,也是園子裡討論最多的專題之一。 前面的系列文章中我們用到了 SysUser, SysRole, SysUserRole 這幾個示例表。 我們以此為基礎,完成RBAC (基於角
MVC 5 + EF6 入門完整教程14 -- 動態生成面包屑導航
maps setting i++ log item 文檔 應該 動態生成 內容 上篇文章我們完成了 動態生成多級菜單 這個實用組件。 本篇文章我們要開發另一個實用組件:面包屑導航。 面包屑導航(BreadcrumbNavigation)這個概念來自童話故事"漢賽爾和格萊特"
ASP.NET + MVC5 入門完整教程三 (上) ---第一個MVC專案
第一個MVC應用程式1建立MVC專案開啟VS ,File--新建--專案,選擇ASP Web專案,命名後確認。選擇(Empty)空模板,專案建立完成,會看到 解決方案管理器 視窗顯示一些資料夾,如圖,這是一個MV
node.js零基礎詳細教程(4):node.js事件機制、node異步IO操作
nod server nbsp node i++ 兩個 con 錯誤 定時器 第四章 建議學習時間3小時 課程共10章 學習方式:詳細閱讀,並手動實現相關代碼 學習目標:此教程將教會大家 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏
MVC5+EF6入門記(二)
key 元素 action 地址 登錄ui acc 場景 stact name 貓和你都歸我 2017/10/01 17:00:29 今天學習了第二課的內容,下面是我總結的知識點,希望會有所幫助,也希望多多指導!一、對專業名詞的解釋Action Method Selec
tensorflow基本教程4:placeholder
import tensorflow as tf input1=tf.placeholder(tf.float32) input2=tf.placeholder(tf.float32) output=tf.multiply(input1,input2)#tensorflow中1.1版本mu
易學筆記-RabbitMQ教程4:選擇性接收訊息(路由器型別為:direct)
易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/
Word2003入門動畫教程25:新增或改變Word頁面邊框
Word2003是微軟公司提供的一款文書處理軟體,可以對文字進行排版和編輯、分段等各種處理,最終將編輯好的內容打印出來,是辦公室一族中必備的辦公軟體之一。我們在製作文件的時候,有時候為了達到某種視覺效果,我們會給文件新增一種邊框做以修飾,具體怎麼操作呢?就讓Word聯盟為大家