1. 程式人生 > >MVC5 + EF6 入門完整教程 四

MVC5 + EF6 入門完整教程 四

上篇文章主要講了如何配置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

privateAccountContext db =newAccountContext();

  1. [基本查詢] 查詢所有的SysUser
[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. var users =from uin db.SysUsers  
  2. ct u;//表示式方式
  3. users = db.SysUsers;//函式式方式
        var users =from uin db.SysUsers

    select u;//表示式方式

        users = db.SysUsers;//函式式方式

  1. [條件查詢] 加入查詢條件
[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1.   users =from uin db.SysUsers  
  2. where u.UserName =="Tom"
  3. select u;//表示式方式
  4. users = db.SysUsers.Where(u => u.UserName =="Tom");//函式式方式
      users =from uin db.SysUsers

    where u.UserName =="Tom"

    select u;//表示式方式

    users = db.SysUsers.Where(u => u.UserName =="Tom");//函式式方式

    NOTE 注意這邊等號是C#寫法 :" =="

  1. [排序和分頁查詢]
[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1.     users = (from uin db.SysUsers  
  2. orderby u.UserName  
  3. select u).Skip(0).Take(5);//表示式方式
  4. users = db.SysUsers.OrderBy(u => u.UserName).Skip(0).Take(5);//函式式方式
        users = (from uin db.SysUsers

    orderby u.UserName

    select u).Skip(0).Take(5);//表示式方式

    users = db.SysUsers.OrderBy(u => u.UserName).Skip(0).Take(5);//函式式方式

    NOTE 只有排序了才能分頁

  1. [聚合查詢]
[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //查user總數
  2. var num = db.SysUsers.Count();  
  3. //查最小ID
  4. var minId = db.SysUsers.Min(u => u.ID);  
        //查user總數

    var num = db.SysUsers.Count();

    //查最小ID

    var minId = db.SysUsers.Min(u => u.ID);

    NOTE 聚合查詢只能通過函式式查詢

  1. [連線查詢]
[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. var users =from urin db. SysUserRoles  
  2.  join uin db. SysUsers  
  3.  on ur.SysUserIDequals u.ID  
  4. elect ur;  
   var users =from urin db. SysUserRoles

    join uin db. SysUsers

    on ur.SysUserIDequals u.ID

  select ur;

NOTE

大家注意,連線查詢返回的結果還是一個型別為SysUserRoles的集合,只是用了內連線進行了的篩選。

那麼問題來了,如果我需要選擇一個集合,裡面包括多張表,如SysUser裡面的UserName和SysRole裡面的RoleName怎麼辦?

這個是通過navigation property來實現的, 前面新建model的時候提到過,例如SysUser裡面的

publicvirtualICollection<SysUserRole> SysUserRoles {get;set; }

但這種做法還是不是太靈活,具體做法我們在下面的詳細步驟裡面講。

EF資料更新

UPDATE步驟比較清晰,直接看下面程式碼。

[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //資料更新,分三步:找到物件--> 更新物件資料--> 儲存更改
  2.   public ActionResult EFUpdateDemo()  
  3.   {  
  4.      //1.找到物件
  5.       var sysUser = db.SysUsers.FirstOrDefault(u => u.UserName =="Tom");  
  6.     //2.更新物件資料
  7.       if (sysUser !=null)  
  8.        {  
  9.          sysUser.UserName ="Tom2";  
  10.        }  
  11.    //3.儲存修改
  12.    db.SaveChanges();  
  13.    return View();  
  14. }  
//資料更新,分三步:找到物件--> 更新物件資料--> 儲存更改

  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類似。

[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //資料新增和刪除
  2. publicActionResult EFAddOrDeleteDemo()  
  3. {  
  4. //新增
  5. //1.建立新的實體
  6. var newSysUser =newSysUser()  
  7. {  
  8. UserName ="Scott",  
  9. Password ="tiger",  
  10. Email ="[email protected]"
  11. };  
  12. //2.增加
  13. db.SysUsers.Add(newSysUser);  
  14. //3.儲存修改
  15. db.SaveChanges();  
  16. //刪除
  17. //1.找到需要刪除的物件
  18. var delSysUser = db.SysUsers.FirstOrDefault(u => u.UserName =="Scott");  
  19. //2.刪除
  20. if (delSysUser!=null)  
  21. {  
  22. db.SysUsers.Remove(delSysUser);  
  23. }  
  24. //3.儲存修改
  25. db.SaveChanges();  
  26. return View("EFQueryDemo");  
  27. }  
//資料新增和刪除

publicActionResult EFAddOrDeleteDemo()

{

//新增

//1.建立新的實體

var newSysUser =newSysUser()

{

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");

}

詳細步驟

  • 查詢使用者及相應角色的功能
  • 修改使用者
  • 增加使用者和刪除使用者

查詢使用者及相應的角色

  1. 在Controller中修改Index方法,新增相關View, 顯示所有使用者
    1. 將model作為引數傳過去

    2. Viewsà Accountà Index.cshtml 頂部新增強型別宣告,

      @modelIEnumerable<MVCDemo.Models.SysUser>

      body中添加個table用來顯示資料

      NOTE

      @Html.ActionLink("Details","Details",new { id = item.ID })生成一個相同controller下的路由地址。

      顯示結果

  2. 增加一個Details方法,新增相關View, 顯示相應使用者及對應的角色
    1. 將特定的model傳過去

    2. Viewsà Accountà Index.cshtml 頂部新增強型別宣告

      @modelMVCDemo.Models.SysUser

      顯示資料,注意方框部分如何導航到另外一張表的資訊中。

      顯示結果

更新使用者,增加使用者,刪除使用者

這三個操作都類似,屬於更新的範疇,我們放在一起來講。

  1. 修改Viewsà Accountà Index.cshtml

    開頭增加Create連結。

    table每條記錄後面增加Edit,Delete連結。

  2. 在Controller中增加相應的方法。

    新建使用者:

[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //新建使用者
  2. public ActionResult Create()  
  3. {  
  4. return View();  
  5. }  
  6. [HttpPost]  
  7. public ActionResult Create(SysUser sysUser)  
  8. {  
  9. db.SysUsers.Add(sysUser);  
  10. db.SaveChanges();  
  11. return RedirectToAction("Index");  
  12. }  
//新建使用者

public ActionResult Create()

{

return View();

}

[HttpPost]

public ActionResult Create(SysUser sysUser)

{

db.SysUsers.Add(sysUser);

db.SaveChanges();

return RedirectToAction("Index");

}


修改使用者:

[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //修改使用者
  2. public ActionResult Edit(int id)  
  3. {  
  4. SysUser sysUser = db.SysUsers.Find(id);  
  5. return View(sysUser);  
  6. }  
  7. [HttpPost]  
  8. public ActionResult Edit(SysUser sysUser)  
  9. {  
  10. db.Entry(sysUser).State =EntityState.Modified;  
  11. db.SaveChanges();  
  12. return RedirectToAction("Index");  
  13. }  
//修改使用者

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");

}


刪除使用者:

[csharp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //刪除使用者
  2. public ActionResult Delete(int id)  
  3. {  
  4. SysUser sysUser = db.SysUsers.Find(id);  
  5. return View(sysUser);  
  6. }  
  7. [HttpPost,ActionName("Delete")]  
  8. public ActionResult DeleteConfirmed(int id)  
  9. {  
  10. SysUser sysUser = db.SysUsers.Find(id);  
  11. db.SysUsers.Remove(sysUser);  
  12. db.SaveChanges();  
  13. return RedirectToAction("Index");  
  14. }  
//刪除使用者

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]

  1. 在右鍵方法名,生成相應的View

    每個View的頂部需要新增一個宣告

    @modelMVCDemo.Models.SysUser

    各個view的body中具體程式碼:

    Create.cshtm

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <body>
  2.     <div>
  3.         <h2>Create</h2>
  4.         @using (Html.BeginForm())  
  5.         {  
  6.             <div>
  7.                 @Html.LabelFor(model => model.UserName)  
  8.                 @Html.EditorFor(model => model.UserName)  
  9.             </div>
  10.             <div>
  11.                 @Html.LabelFor(model => model.Email)  
  12.                 @Html.EditorFor(model => model.Email)  
  13.             </div>
  14.             <div>
  15.                 @Html.LabelFor(model => model.Password)  
  16.                 @Html.PasswordFor(model => model.Password)  
  17.             </div>
  18.             <div>
  19.                 <inputtypeinputtype ="submit"value="Create"/>
  20.             </div>
  21.         }  
  22.         <div>@Html.ActionLink("Back to List", "Index")</div>
  23.     </div>
  24. </body>
<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>
                <inputtype ="submit" value="Create" />
            </div>
        }
        <div>@Html.ActionLink("Back to List", "Index")</div>
    </div>
</body>



Edit.cshtml

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <body>
  2.     <div>
  3.         <h2>Edit</h2>
  4.         @using (Html.BeginForm())  
  5.         {  
  6.             @Html.HiddenFor(model => model.ID)  
  7.             <div>
  8.                 @Html.LabelFor(model => model.UserName)  
  9.                 @Html.EditorFor(model => model.UserName)  
  10.             </div>
  11.             <div>
  12.                 @Html.LabelFor(model => model.Email)  
  13.                 @Html.EditorFor(model => model.Email)  
  14.             </div>
  15.             <div>
  16.                 @Html.LabelFor(model => model.Password)  
  17.                 @Html.PasswordFor(model => model.Password)  
  18.             </div>
  19.             <div>
  20.                 <inputtypeinputtype ="submit"value="Save"/>
  21.             </div>
  22.         }  
  23.         <div>@Html.ActionLink("Back to List", "Index")</div>
  24.     </div>
  25. </body>
<body>

    <div>

        <h2>Edit</h2>

        @using (Html.BeginForm())
        {

            @Html.HiddenFor(model => model.ID)

            <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>

                <inputtype ="submit" value="Save" />

            </div>

        }

        <div>@Html.ActionLink("Back to List", "Index")</div>

    </div>

</body>


Delete.cshtml

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <body>
  2.     <div>
  3.         <h2>Delete</h2>
  4.         <h3>Are you sure you want to delete this?</h3>
  5.         <h4>User</h4>
  6.         <dl>
  7.             <dt>@Html.DisplayNameFor(model => model.UserName)</dt>
  8.             <dd>@Html.DisplayFor(model => model.UserName)</dd>
  9.             <dt>@Html.DisplayNameFor(model => model.Email)</dt>
  10.             <dd>@Html.DisplayFor(model => model.Email)</dd>
  11.         </dl>
  12.         @using (Html.BeginForm())  
  13.         {  
  14.             <div>
  15.                 <inputtypeinputtype ="submit"value="Delete"/>
  16.             </div>
  17.         }  
  18.         <div>
  19.             @Html.ActionLink("Back to List", "Index")  
  20.         </div>
  21.     </div>
  22. </body>
<body>

    <div>

        <h2>Delete</h2>

        <h3>Are you sure you want to delete this?</h3>

        <h4>User</h4>

        <dl>

            <dt>@Html.DisplayNameFor(model => model.UserName)</dt>

            <dd>@Html.DisplayFor(model => model.UserName)</dd>



            <dt>@Html.DisplayNameFor(model => model.Email)</dt>

            <dd>@Html.DisplayFor(model => model.Email)</dd>

        </dl>



        @using (Html.BeginForm())
        {

            <div>

                <inputtype ="submit" value="Delete" />

            </div>

        }

        <div>

            @Html.ActionLink("Back to List", "Index")

        </div>

    </div>

</body>


NOTE

針對上面這些程式碼,我們提一下其中用到的HtmlHelper, 主要有這麼幾個:

DisplayNameFor (model=>model.xxx)à 生成純文字,顯示xxx列名

DisplayFor (model=>model.xxx)à 生成純文字,顯示xxx列的內容

LableFor à 生成一個Lable標籤

EditorFor

相關推薦

MVC5 + EF6 入門完整教程

上篇文章主要講了如何配置EF, 我們回顧下主要過程: 建立Data Model à 建立Database Context à建立databaseInitializerà配置entityFramework的context配置節。 對這個過程還有疑問的可以去上篇再看一下。 本次我們就主要講解 (1)

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 入門完整教程4 :EF基本的CRUD

上篇文章主要講了如何配置EF, 我們回顧下主要過程:建立Data Model à 建立Database Context à建立databaseInitializerà配置entityFramework的context配置節。對這個過程還有疑問的可以去上篇再看一下。本次我們就主

MVC5 + EF6 入門完整教程

第0課 從0開始 ASP.NET MVC開發模式和傳統的WebForm開發模式相比,增加了很多"約定"。 直接講這些 "約定" 會讓人困惑,而且東西太多容易忘記。 和微軟官方教程不同,筆者儘量不用腳手架,從空白框架開始,一步一步新增功能,每次新增的東西剛好夠用,讓大

MVC5+EF6 入門完整教程

本篇是相對獨立的一篇,主要講解不丟失資料進行資料庫結構升級。 前面我們講解EF功能時(見第三篇文章)已經介紹過一種更新資料庫的方式: EF比較model和database,如果兩邊不一致,程式將會drop and re-create資料庫。 本篇文章我們會使用 co

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 入門完整教程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

MVC5+EF6入門記(二)

key 元素 action 地址 登錄ui acc 場景 stact name 貓和你都歸我 2017/10/01 17:00:29 今天學習了第二課的內容,下面是我總結的知識點,希望會有所幫助,也希望多多指導!一、對專業名詞的解釋Action Method Selec

【OpenCV影象處理入門學習教程】基於LoG運算元的影象邊緣檢測

一、基於LoG運算元的影象邊緣檢測原圖:1.LoG運算元與自定義濾波運算元進行比較的結果:2.LoG運算元的結果:3.自定義3*31 1 1 1 -8 1 1 1 1 濾波結果:二、程式碼解析下面是一段基於LoG運算元的影象邊緣檢測的程式碼,同時會生成兩個結果,一個是LoG運算元的結果,第二個是自

【第篇】ASP.NET MVC快速入門完整示例(MVC5+EF6

redirect name php sql語句 rop 方法 輸入框 一次 編輯 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門

MVC5 + EF6 完整入門教程

期待已久的EF終於來了。 學完本篇文章,你將會掌握基於EF資料模型的完整開發流程。 本次將會完成EF資料模型的搭建和使用。 基於這個模型,將之前的示例新增資料庫查詢驗證功能。 文章提綱 概述 & 要點 詳細步驟 總結 概述 & 要點 下面是本文要點,正文部分會有

MVC5+EF6 完整教程17--升級到EFCore2.0

app authent 查詢 pan 得到 登錄界面 dbconnect 升級 class 原文:MVC5+EF6 完整教程17--升級到EFCore2.0EF Core 2.0上周已經發布了,我們也升級到core 文章內容基於vs2017,請大家先安裝好vs2017(1