什麼時候用Model,什麼時候用Entity?

在建立一個實體類的時候,究竟是用Model還是用Entity?比如MVC中,Model存了數據實體,但是他被稱為Model,而在EF中,Entity也是存放數據實體,卻被稱作Entity,這兩者有何區別?那究竟什麼時候應該用Model什麼時候應該用Entity呢?


一般這種稱謂都是根據上下文來的,例如Model是因為有MVC,或MVVM的場景下所以叫做Model,這裡的Model就是一種職責。Entity則更接近是一種表達業務概念的實體,例如一個User,一個Order等等,而這樣的實體在MVC中起到Model的職責。EF的作用是幫助你存取Entity的,而不關心你把這個Entity用作MVC里的Model還是Observer模式中的Subject對象。

當然以上都是我常用的理解方式,不同的項目內部完全可以有不同的理解方式,只要項目內部統一,不會引起混淆即可。命名一直是件很難的事情,實際中絕大部分項目都是要權衡的,也都是有各種不完美的地方的。例如,.NET類庫中各種ObservableCollection,ReadOnlyCollection,按照「規範」都應該叫做ObservableList,ReadOnlyList,而Collection這是個更寬泛的概念。

我們可以花一部分精力去考慮這方面問題,但也不用糾結太多,頭大且對項目也沒太大幫助。


MVC是模式,EF是ORM,角色不同。MVC裡面的Model是C發給V的。這些Model應該被高度優化,僅僅被對應的View用來顯示,額外的數據應該被Model層砍掉以節省磁碟訪問、內存佔用或者資料庫帶寬。通常情況下,View的數量都會比你資料庫的Entity要多,比如用戶要求的各種各樣的報表,所以對應的Model也應該比數據訪問層的Entity多。

用編寫資源管理器界面打個比方。在不同的顯示模式下。這裡的Model可以是WIN32_FIND_DATA這樣的常用文件屬性。也可以是常用文件屬性加上IShellItemImageFactory返回的縮略圖。

假設你的View和你的EF的實體類完全一一對應,可以不編寫額外的Model。但是隨著需求的增多,很難一直使用EF的實體類來做Model。


model,entity,dto,viewmodel這些新手比較迷茫到底有什麼區別,

說白了都是一個類,裡面有些屬性欄位。

那怎麼區分他們,我說的簡單點吧,我的理解是這樣的:

model是一個模型,裡面裝了各種數據,將一個model傳遞給view,在試圖頁面就可以使用model裡面的數據來呈現到頁面上。

而entity是實體,就是和數據表一一對應的,一個實體一張表。

官方的demo沒有entity這個說法,他只有model,model就是表,也是傳遞給view的model,就是說他的model即是model又是entity。而我們實際運用需要將model分成ViewModel和Entity,甚至還要加入Dto。

因為那個案例很簡單,比如詳細介紹頁面直接返回一個model,這個model就是表中的一條數據。但是在我們實際建站需求中頁面上怎麼可能只需要一條數據就完了,很多時候還需要其他的數據,比如新聞內容頁面需要的有新聞的各種欄位、最新文章10條、最熱文章10條。

那這個視圖就需要這樣一個VIewModel:

public class NewsDetailModel{

public news{get;set;} //這片新聞的全部數據

public list& LastNews{get;set;} //最新10篇新聞

public list& HotNews{get;set;} //最熱10篇新聞

}

而新聞實體entity(新聞表):

public class news{

public int ID{get;set;}

public string Title{get;set;}

public string Content{get;set;}

public int Clicks{get;set;}

public datetime PostTime{get;set;}

}

我們在控制器的action種返回的model就是NewsDetailModel,這樣我們在頁面上才能在Model種使用新聞內容中的數據,還有最新最熱的10篇文章。

現在你應該理解什麼是model,什麼是entity了吧。

然後最新最熱一般我們只需要一個標題列表,沒必要把內容時間也查詢出來。而我們直接查詢最新最熱的文章直接tolist的話包含了全表的數據,這個時候我們就要用dto,

public class NewsTitleListDto{

public int ID{get;set;}

public string Title{get;set;}

}

然後上面的model就改成

public class NewsDetailModel{

public news{get;set;} //這片新聞的全部數據

public list& LastNews{get;set;} //最新10篇新聞

public list& HotNews{get;set;} //最熱10篇新聞

}

然後將數據只查詢id和標題,查詢出來交給lastnews和hotnews就可以了。

其實這個model就是上面提到的viewmodel。viewmodel就是試圖需要的model,說白了就是視圖上需要的數據包。而entity只是數據表欄位。dto是數據傳輸對象,根據業務需要哪些數據就放哪些數據。

再比如用戶表有很多很多的欄位,但是註冊的時候只需要賬號、密碼、手機、註冊時間這幾個欄位。那就可以建立一個RegisterDto,最後將這個dto的數據傳遞給model再寫入數據,至於傳遞數據可以手動複製給entity也可以使用automapper來自動映射。

反正需要你慢慢理解,一步一步的深入。


Model有很多種,ER Model里可以包含Entity,也可以包含Relationship啊,不過在OO里,1對N或N對N的RelationShip更多的表現為Entity對象的引用,但N對N還是會被當作RelationShip對象。其實按照ORM,不光有Entity,還有Dependent,就是不能獨立決定生命周期的數據。

如果按MVC的角度,一個對象可能叫Model,但是從其他的角度,Modell可能叫Business Object或Domain Object,不光是作為MVC的M,還封裝了部分業務邏輯。

除此以外,還有Value Object(Data Transfer Object)和Data Access Object。


微軟裡面很多的東西都是實現了Martin Fowler的企業架構模式和DDD(領域驅動設計)裡面的一些概念。按照DDD的方式來理解的話:

* MVC裡面的M是屬於View Model以及Input Model, 其中View Model是你扔到Razor裡面的那個東西。Input Model是你Action參數裡面得到的那些通過model binding的來的東西。

* Entity Framework裡面的entity是指DDD那些人說的entity。DDD中的entity是指一個aggregate裡面的三種常見對象(aggregate root, entity, value object, 其中aggregate root是一種特殊的entity,因為是root)。

DDD簡單說是: 一個項目裡面有多個Bounded Context, 譬如說一個是前檯面向用戶的,一個是後檯面向公司內部人員的。每個Bounded Context裡面會分為多個aggregate。每個aggregate裡面包含了一堆需要保證事務性一致的物體,也就是說從全局來說,每個aggregate都是當作一個整體。常見的例子就是Order(訂單)和OrderLine(訂單裡面的商品)。Entity包括Aggregate root都有唯一標識。兩者的區別是aggregate root全局裡面有唯一標識,而aggregate 內部其他entity只是在aggregate內部有唯一標識(也許你資料庫裡面有主鍵,但是這邊是指概念上來說這個唯一標識對全局來說意義不大,只有在aggregate內部意義才大)。另外的value object就是沒有標識的物體,他們的意義就在於它的值,你可以想像成比較兩個entity是不是同一個只需要判斷ID是否相等,而判斷value objects需要看裡面的每個屬性是否一樣。

最後回答你的問題:

* MVC整體屬於展現層的概念。也就是這個M是跟View溝通的,要麼是進入View的要麼是從View裡面來的。

* Entity是業務邏輯層(Business Logic Layer)的概念。但是,EF本身屬於數據層(Data Access Layer)的概念。但是微軟為了給你行方便,給你搞的ORM是可以讓你直接可以拿來跟領域模型(Domain Model)裡面的Entity一一對應的。

另外關於Model這個詞的使用。model本身就是模型,你可以在展現層有模型,在業務邏輯層有模型。到處都用這個詞,可能想不到更好的了吧。

除了MVC,MVVM這些使用model之外。DDD的人最喜歡說的是Domain Model。Domain Model是DDD的人認為正確的實現業務邏輯的一種方式,其他的實現業務邏輯的方式有martin fowler總結的transaction script, table module, active record,甚至包括anemic domain model)。而Domain Model就是上面說的那些Aggregates的設計。你可以說這裡model就是指一個aggregate,其包括了entity,以及value objects這些東西,以及domain services。


有點像資料庫里的視圖和表


咋說呢,

假設把幾個entity拼成一個list

是不是感覺叫model爽一些了?

entity一般是與sqldb對應的


MVC的M是數據模型,是基於應用層的信息傳遞包,主要是將C處理的結果發送到V時的數據打包起來(其中可能還包括對V的控制等數據)。

Entity是和數據源之間的數據模型,是基於數據層的數據包,就是將數據源的信息結構化成各類對象供C使用。

從完整度來說,M是處理過後給V顯示處理用的,Entity就是一個個數據化的事物。兩者基本不重合吧。


不回答問題,我只是stack overflow搬運工

what is difference between a Model and an Entity


Entity 映射資料庫表

Model 用來集中管理數據,可以理解為 View-Model


樓主其實已經清楚了,在mvc里叫model,在EF里叫entity。 兩都有時能對應上,有時對應不上。


推薦閱讀:

現在繼續搞.net還有前途嗎?
怎麼用asp.net做一個簡單的留言板?
ASP.NET Core 性能提升23倍是怎麼回事?
公司組織做.net技術分享,不用太深奧,有哪些技術點可以用來做交流分享?
網站上能實時通知的私信功能應該怎麼實現?

TAG:ASPNET | ASPNETMVC | EntityFramework |