MVC-05 Model(1)

??? 在開發應用程序的過程中,經常需要處理許多大大小小的數據,例如,SQL Server數據庫存取、連接AD(Active Directory)數據庫進行驗證、調用外部Web Service取得數據等。除了訪問數據外,也經常需要對數據做成格式驗證、邏輯驗證等等。

?一、Model的責任

??? 在ASP.NET MVC中,Model負責所有與“數據”有關的任務。所以,不管是Controller或是View,都會參考到Model里定義的所有數據類型,或是用到Model里定義的一些數據操作方法,例如,新增、刪除、更改、查詢等。

??? 在Model里的程序,由于“只能”跟數據域商業邏輯有關,所以就不負責處理所有與數據處理無關的事,或是用來控制網站的運行流程等,而是專注于如何有效率地提供數據訪問機制、交易環境、數據格式驗證、商業邏輯驗證等工作。

??? 由于Model的獨立性非常高,如果你在一個Visual Studio方案中,有多個要開發的項目,比如有時我們會將Model獨立成一個項目,讓Model項目共享于不同的項目之間。

二、開發Model的基本觀念

??? 當采用ASP.NET MVC框架時,雖然在Model層的開發技術繁多,而且ASP.NET MVC也保留了許多彈性,讓各個不同的數據訪問技術都能跟ASP.NET MVC集成。不過,若要充分發揮ASP.NET MVC快速開發的優勢,還是建議讀者在Model層采用ORM信息訪問技術來開發,例如,LINQ to SQL、Entity Framework、NHibernate、Telerik OpenAccess ORM等。

1.何謂ORM

??? ORM的全名是Object Relational Mapping,中文翻譯為“對象關系映射”,是一種編程技術,用于實現面向對象程序語言里,不同類型系統之間的數據轉換。通常在實務的應用上,大多數情況都會應用在數據庫與面向對象程序自檢的類型轉換,例如,SQL Server中的關系型數據與.NET類型對象之間的轉換等。

??? 換句話說,ORM是將結構化的關系型數據,映射成面向對象模型。如果以Entity Framework來說,就是試圖將關系數據庫的各種數據轉換成.NET原生對象,或是將.NET模型類對象數據轉換成關系型數據。

??? 使用ORM開發技術跟常規使用ADO.NET開發技術最大的差異,就在于操作“數據”的方便性與彈性。以往在使用ADO.NET開發數據訪問程序時,開發人員通常必須先了解完整的數據庫操作方法,才能順利地從數據庫取得數據,或是將對象的數據保存到數據庫中。例如,要編寫操作SQL Server數據庫中的數據,就必須先學習T-SQL的使用方式;若要操作Oracle數據庫中的數據,也必須先學習Oracle的SQL查詢語法。學會之后還要學習各式ADO.NET的標準API,才能知道如何正確地與數據庫交互,明白是要進行查詢數據、更新數據、新增數據還是刪除數據等。不同的數據庫,在設計邏輯與SQL語法上都會有些小差異,而導致開發數據訪問的程序代碼缺乏效率。如此一來,也有違“關注點分離”的特性,若是套用“關注點分離”特性,照理說在開發.NET應用程序時,應該專注在對象的操作上,而非數據庫數據的處理,當采用ORM開發技術后,便可以幫助我們達到這個目的。

??? Entity Framwork是建構在ADO.NET數據提供者模型之上,也就是說,只要.NET運行環境能夠使用ADO.NET連接數據庫,Enity Framework便能順利支持,在.NET運行環境下默認已經支持SQL Server 2005以上版本,如果要支持其他如Oracle、MySQL、SQLite、PostgreSQL等各式各樣的關系數據庫基本上也是沒問題的,只要操作出相對應的Entity Framework數據提供者即可。

2.數據庫開發模式

??? 采用Entity Framework或其他ORM開發極速,有時還可區分三種不同的開發模式,分別是數據庫優先開發模式(Database First Development)、模型優先開發模式(Model First Development)、程序代碼優先開發模式(Code First Development)。

(1)數據庫優先開發模式

??? 顧名思義,數據庫優先開發模式就是針對數據庫進行設計,以數據庫里定義的數據結構(Schema)為主。當應用程序在卡法的時候,必須依據數據庫的結構設計來進行開發,使用的ORM框架必須能夠依據數據庫結構設計生成相應的對象模型,才能提供給應用程序來使用。

(2)模型優先開發模式

??? 模型優先開發模式是指在ORM架構中創建對象模型,讓應用程序能夠依據這些對象模型進行開發。需要實際訪問數據庫時,只要通過Entity Framework數據提供者的協助,動態生成相應的SQL語法,即可創建出完整的數據庫。

??? 一般來說,支持模型優先開發模式的ORM框架,都會有相對應的程序代碼生成技術,在模型被創建的同時自動生成相對應的程序代碼。以Entity Framework為例,在搭配Visual Studio的幫助下,即可通過Entity Framework設計工具,幫你創建對象模型,只要保存后,就會自動生成相關程序代碼。

(3)程序代碼優先開發模式

??? 程序代碼優先開發模式是一種非常新穎的開發模式,也就是讓開發人員直接依據需求,編寫類別與屬性(程序代碼),而這些撰寫的類別與屬性正是定義出應用程序所需的數據模型,并且通過ORM框架的管理,便可讓這些POCO類型,轉換成實體模型(Entity Model)。

??? 直到程序開始運行后,通過ORM框架,就可以自動依據這些類別,定義創建數據庫、表格、字段與其他數據結構(Schema)。這樣開發人員便可以完全不需要接觸數據庫這一端的各種管理工作(如創建表格字段、設計數據表、設計數據表關聯等),也不用學習各式數據庫的使用差異(如SQL Server、Oracle、MySQL、SQLite等),省去這些工作之后,開發人員更能專注在應用程序的需求開發,而不會因為不熟悉數據庫操作而束手束腳。

三、LocalDB介紹

??? 微軟最新推出的SQL Server 2012 Express LocalDB,是一種SQL Server Express的運行模式,特別適合在開發環境使用,也內建在Visual Studio 2012之中。

1.LocalDB的運作方式

??? 在安裝好SQL Server 2012 Express LocalDB之后,默認會有個實例名,為v11.0。

2.如何連接LocalDB實例

(1)使用Management Studio連接LocalDB

??? 在連接對話框中輸入正確服務器名稱,(localdb)\v11.0。只有新版的SQL Server 2012 Management Studio才能識別這組新的服務器名稱。

(2)通過.NET程序連接LocalDB實例

??? 連接字符串如下。

Server=(LocalDB)\v11.0; Integrated Security=true; AttachDbFileName=D:\Data\MyDB1.mdf

3.管理LocalDB自動實例

4.管理LocalDB具名實例

四、使用Code First創建數據模型

??? ASP.NET MVC4與當前最新版的Entity Framework 5同時上市,尤其強化了程序代碼優先開發模式的支持。

1.創建數據模型

(1)聲明主鍵

??? 要想在Entity Framework聲明主鍵,最簡單的方式就是不要聲明,直接把屬性名稱設置為Id或是類名+“Id”也可以,并將該屬性指派為int類型即可。EF Code First會自動識別出這個字段就是表格里的主鍵,并且會加上自動編號的識別規格設置。

???? 當希望使用其他域名當作主鍵時,就可能遇到一些麻煩。可以加上key屬性(Attriute),引用System.ComponentModel.DataAnnotations命名空間。

using System;
using System.ComponentModel.DataAnnotations;namespace MvcGuestbook.Models
{public class Guestbook{[Key]public int No { get; set; }public string Name { get; set; }}
}

(2)聲明必填字段

??? 聲明為string的屬性,在數據庫表格里的字段設置為NOT NULL。如果需要改為必填字段,可以加上Required屬性,引用System.ComponentModel.DataAnnotations命名空間。

using System;
using System.ComponentModel.DataAnnotations;namespace MvcGuestbook.Models
{public class Guestbook{[Key]public int No { get; set; }[Required]public string Name { get; set; }}
}

(3)聲明允許NULL字段

??? 聲明為DateTime的屬性,在數據庫表格里的字段設置為NOT NULL。如果需要改變允許為空字段,可以加上一個問號,不需要引用任何命名空間。

using System;
using System.ComponentModel.DataAnnotations;namespace MvcGuestbook.Models
{public class Guestbook{[Key]public int No { get; set; }[Required]public string Name { get; set; }public string Emai { get; set; }[Required]public string Message { get; set; }public DateTime? CreatedOn { get; set; }}
}

(4)聲明字段長度

??? 我們也經常會在數據庫中限定特定字段的字符串長度,以方便日后創建字段索引,可以使用MaxLength屬性,引用System.ComponentModel.DataAnnotations。

using System;
using System.ComponentModel.DataAnnotations;namespace MvcGuestbook.Models
{public class Guestbook{[Key]public int No { get; set; }[Required][MaxLength(5)]public string Name { get; set; }[MaxLength(200)]public string Emai { get; set; }[Required]public string Message { get; set; }public DateTime? CreatedOn { get; set; }}
}

??? 也可以設置StringLength屬性來限定字段長度。

Model類中為屬性添加MaxLength說明,需要引用(?? ?)命名空間。

A.System.Linq???????????????????????????? B. System.ComponentModel

C. System.ComponentModel.DataAnnotations? D. System.Collection.Generic

(5)聲明字段默認值

(6)聲明特定屬性不是數據庫中的字段

??? 只要數據模型中出現公開屬性,默認就會在數據庫中創建一個對應的字段,但如果在數據模型中的屬性,是一個動態計算的屬性,我們并不想在數據庫中新增對應的字段時,該怎么辦?可以加上NotMapped屬性(Attribute),引用System.ComponentModel.DataAnotations.Schema。

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;namespace MvcGuestbook.Models
{public class Guestbook{[Key]public int No { get; set; }[Required][MaxLength(5)]public string Name { get; set; }[MaxLength(200)]public string Emai { get; set; }[Required]public string Message { get; set; }[DatabaseGenerated(DatabaseGeneratedOption.Computed)]public DateTime? CreatedOn { get; set; }[NotMapped]public string FamilyName{get{return this.Name.Substring(0, 1);}set{this.Name = value.Substring(0, 1) + this.Name.Substring(1);}}}
}

?

使用EF Code First在模型中聲明特定屬性不是數據庫中的字段,應使用(? )關鍵字。

A.Key??? B.Required??? C.DisplayName??? D.NotMapped

(7)DisplayFormat

獲取數據字段的顯示格式。例如可用于設置日期的格式。

(8)DataType

獲取與數據字段關聯的類型。例如DataType.Date。

(9)DatabaseGeneratedOption

DatabaeGeneratedOption.Computed,計算列

DatabaseGeneratedOption.Identity,標識自動加1

DatabaseGeneratedOption.None,沒有標識,不自動加1

(10)Column

將類與數據庫中的表相關。?[Column(“FirstName”)]public string FirstMidName{get;set;}

2.創建數據上下文類

????數據上下文類,在Entity Framework Code First開發模式下非常重要,主要用來追蹤與識別對象的變更追蹤。少了這個類別,Entity Framework就完全無法運作。

??? 自動添加數據上下文類,可以在添加控制器時操作。

    public class MvcGuestbookContext : DbContext{public MvcGuestbookContext(): base("name=DefaultConnection"){}public DbSet<Guestbook> Guestbooks { get; set; }}

??? 構造函數中的DefaultConnection為連接字符串的名字,這個連接字符串必須存儲在web.config中。DbSet<Guest>類型的Guestbooks變量,代表的是Guestbook這個類型的數據庫集合對象。

??? 如果希望將Guestbook數據模型被聲明成只讀,不讓應用程序對其寫入任何數據,那么可以修改數據上下文類,讓DbSet集合屬性只提供get實體。

    public class MvcGuestbookContext : DbContext{public MvcGuestbookContext(): base("name=DefaultConnection"){}public DbSet<Guestbook> Guestbooks{get { return Set<Guestbook>(); }}}

?

3.設計模型之間的關聯性

??? 在設計數據庫結構時,當遇到表格與表格間有關聯存在時,一般會通過創建外鍵(Foreign Key)的方式設計表格之間的關聯關系。

(1)設計模型之間的一對多關聯

public class Guestbook{[Key]public int No { get; set; }[Required][MaxLength(5)]public string Name { get; set; }[MaxLength(200)]public string Emai { get; set; }[Required]public string Message { get; set; }public virtual Member Member { get; set; }}
    public class Member{public int Id { get; set; }[Required][MaxLength(5)]public string Username { get; set; }[MaxLength(10)]public string Password { get; set; }public DateTime? LastLoginTime { get; set; }

public virtual ICollection<Guestbook> Guestbooks { get; set; }}

?(2)設計模型之間的多對多關聯

??? 將上述代碼中的public virtual Member Member { get; set;},更改為:

public virtual ICollection<Member> Members { get; set; }

4.啟用延遲裝入特性

??? 使用ORM框架,基本上都會添加“延遲裝入”的特性支持,Entity Framework當然也不例外。當使用Entit Framework的ObjectContext與DbContext操作數據時,默認都啟用“延遲裝入”。也就是當我們在應用程序里通過LINQ to Entity查詢數據時,如果遇到關聯數據尚未裝入的情況,Entity Framework會自動幫我們再向數據庫索取關聯數據,全自動地取得關聯數據,大幅降低編寫訪問關聯數據的程序代碼。

??? 若要在Code First模型類別中啟用“延遲裝入”特性,必須在屬性聲明時加上virtual關鍵詞。

??? >>導航屬性?

??? 它是實體類上的可選屬性,它允許從關聯的一端導航到另一端。與其他屬性不同,導航屬性并不攜帶數據。

轉載于:https://www.cnblogs.com/meetyy/p/3474092.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260984.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機 數據庫知識點,數據庫知識點總結

實體&#xff0d;聯系模型基本概念實體和屬性實體是客觀存在并且可以相互區分的任何事物屬性是實體所代表事物具有的某種特性每個屬性都有一定的取值范圍&#xff0c;成為該屬性的值域實體集和碼實體集是具有相同屬性的實體的集合實體的值是該實體諸屬性值的列表實體集的值是該…

計算機網絡課程思政教學設計,信息與網絡工程學院成功舉辦第一屆課程思政教學設計大賽...

為有效貫徹全國高校思想政治工作會議精神&#xff0c;強化課程思政建設&#xff0c;全面提高人才培養質量&#xff0c;根據《教務處關于舉辦第一屆課程思政教學設計大賽的通知》要求&#xff0c;結合學院工作安排&#xff0c;7月18日&#xff0c;信息與網絡工程學院在龍湖校區西…

Java 中參數傳遞是傳值還是引用?

2019獨角獸企業重金招聘Python工程師標準>>> 明確概念 值傳遞&#xff1a;指的是將變量的一個備份傳過去&#xff0c;當該備份被修改后&#xff0c;不會影響原來變量的值&#xff1b; 引用傳遞&#xff1a;指的是將該變量的地址傳過去&#xff0c;當值修改后&#x…

sencha touch 手勢識別左右滑動

sencha touch 中添加手勢識別非常簡單&#xff0c;就是監聽 dom 元素的 move 事件&#xff1a; 1. 為你的 view 注冊 swipe 事件 // 為當前 view 注冊手勢滑動事件 Ext.get(myTouchView).on(swipe, onViewSwipe, this); 2. 判斷滑動方向 // 手勢滑動監聽事件 onViewSwipe : fun…

比較兩浮點數的方法

在工作中&#xff0c;我需要比較一系列數據&#xff0c;一方數據精度為兩位小數,而另一方精度為三位小數。我需要將三位小數四舍五入成兩為小數后進行比較。在操作的過程中&#xff0c;問題出現了&#xff0c;明明應該相等的數據卻走了不等的分支。什么原因導致呢&#xff1f;一…

IIS8托管WCF服務

WCF服務程序本身不能運行&#xff0c;需要通過其他的宿主程序進行托管才能調用WCF服務功能&#xff0c;常見的宿主程序有IIS&#xff0c;WAS&#xff0c;Windows服務&#xff0c;當然在學習WCF技術的時候一般使用控制臺應用程序或WinForm程序進行托管。本文將詳細介紹如何使用I…

北京師范大學認知神經科學 計算機,北京師范大學認知神經科學和學習國家重點實驗室.pdf...

北京師范大學認知神經科學和學習國家重點實驗室北京師范大學認知神經科學與學習國家重點實驗室DTI 、靜息fMRI、形態學測量原理及數據分析與應用深度講習班(第二輪通知)近年來&#xff0c;磁共振技術已廣泛地應用到神經科學、認知神經科學、臨床醫學等領域的研究&#xff0c;而…

JAVA面向對象-----instanceof 關鍵字

instanceof 關鍵字 1&#xff1a;快速演示instanceof Person pnew Person();System.out.println( p instanceof Person); 2&#xff1a;instanceof是什么&#xff1f; 1&#xff1a;屬于比較運算符&#xff1a; 2&#xff1a;instanceof關鍵字&#xff1a;該關鍵字用來判斷一…

電子工程師必去的論壇網站

Abstract 搞電子不能閉門造車&#xff0c;要到網上去交流交流&#xff0c;做個網絡吸血鬼也好。本人偶然也發一些資料&#xff0c;還是要感謝活躍在各大論壇上的大蝦們&#xff0c;讓小弟要走了不少彎路。有問題google一下&#xff08;不是本人崇洋媚外&#xff0c;google的功能…

對象的引用

int、datetime、bool、char等類型都屬于值類型&#xff08;valuetype&#xff09;&#xff0c;賦值的時候是傳遞拷貝。 普通的對象則是引用類型&#xff0c;賦值的時候是傳遞引用。傳遞給函數也是引用傳遞的。轉載于:https://www.cnblogs.com/roboot/archive/2012/02/15/235329…

Cesium應用篇:3控件(3)SelectionIndicator InfoBox

假設這樣一個場景&#xff0c;用戶在Cesium球上加載了一個GeoJson文件&#xff08;DataSource&#xff09;&#xff0c;里面是全美國所有州的Geometry信息&#xff08;Entity&#xff09;&#xff0c;疊加到球面后&#xff0c;你自然會有一種沖動&#xff0c;點擊某一個州&…

北理工計算機學院新聞,北理工計算機學子勇奪CVPR 2021 AI安全國際頂級賽事季軍...

2021年4月19日&#xff0c;CVPR 2021挑戰者計劃第六期落下帷幕。由北理工計算機學院教師李元章、張全新及廣州大學李進教授指導的DemiguiseWoo戰隊&#xff0c;在挑戰賽賽道二“ImageNet無限制對抗攻擊”發起沖擊&#xff0c;最終以9303.6的總分取得決賽第三名的好成績&#xf…

字符串入門

暴力 字典樹總結&#xff1a;字典樹的功能就是map字符串得到編碼或者查詢前綴關系套模板的時候注意t,s,&#xff0d;‘a’,[26],sz0的初始化還有一個問題&#xff0c;到底字典樹開多少內存比較合適&#xff0c;反正至少是要開字符總長度*2hdu1251 http://acm.hdu.edu.cn/showpr…

C++ 的基礎概念(3)——多態詳解。

最近兩次面試都問到了多態&#xff0c;我也不得不重視起來了&#xff0c;最近最大的收獲就是&#xff1a;基礎知識很重要&#xff0c;就算你很會寫代碼&#xff0c;但是面試官問你基礎知識答不上來的話&#xff0c;也很難被人賞識和錄用&#xff0c;所以還是要多補補基礎概念&a…

美育在計算機教育中應用,在現代教育技術中綻放數學美育之花

21世紀是信息化的社會&#xff0c;計算機、網絡等現代技術的飛速發展&#xff0c;作為現代教育技術&#xff0c;計算機多媒體技術和網絡技術已經越來越多地走進小學數學課堂&#xff0c;為深化教學改革&#xff0c;培養學生能力&#xff0c;發展學生個性&#xff0c;提供了嶄新…

.NET Forms身份驗證

.NET表單身份驗證 ASP.NET Forms 身份驗證的簡單實現&#xff1a;1&#xff09;在Web.config文件中配置應用程序使用 Forms 身份驗證&#xff1b;2&#xff09;創建登陸頁面&#xff0c;將用戶身份驗證票證添加到Cookie集合。1.配置文件中設置為Forms驗證<authentication mo…

Oracle SQL篇(三)Oracle ROWNUM 與TOP N分析

首先我們來看一下ROWNUM&#xff1a;含義解釋&#xff1a;1、rownum是oracle為從查詢返回的行的編號&#xff0c;返回的第一行分配的是1&#xff0c;第二行是2&#xff0c;依此類推。這是一個偽列&#xff0c;可以用于限制查詢返回的總行數。2、rownum不能以任何基表的名稱作為…

C++ Primer 第10章 pair類型

//10.2.cpp //至少使用三種方法創建pair對象。 //編寫三個版本的程序&#xff0c;分別采用不同的方法來創建pair對象 //方法1&#xff1a;在定義pair對象時提供初始化式來創建pair對象#include<iostream> #include<vector> #include<utility> #include<st…

計算機對口升學可以報考的學校,對口升學可以報考的學校都在這里,趕快來收藏吧...

對口升學指對口高考&#xff0c;在平常又叫對口單招&#xff0c;對口升學&#xff0c;是從中等職業學校畢業生招生&#xff0c;強調中等職業學校畢業生對口升高職的專業技能考試&#xff0c;以專業技能成績為主要錄取依據的招生辦法。報名條件具有正式學籍的中等職業學校畢業生…

Visual Studio 常用快捷鍵 (二)

想不到上一篇 【Visual Studio 常用快捷鍵】 受這么多人的歡迎。看來大家對Visual Studio的用法非常感興趣。 接下來我準備寫一個 “Visual Studio使用技巧 ” 一個系列的博客。 希望對大家有所幫助 本篇繼續介紹幾個常用的快捷鍵 閱讀目錄 按兩下Tab鍵回退到光標的上一次位置…