顯示包含「MVC」標籤的文章。顯示所有文章
顯示包含「MVC」標籤的文章。顯示所有文章

2017年6月20日星期二

ASP.NET MVC EntityFramework DataContext (*.edmx) 應該放在哪裡?

以前我做 Webforms Project的時候,很多時求個方便,都都直接在同一個Project下建立DBContext (*.edmx),之後就會在DAL或BLL層面直接利用。
當然還是有機會引起Class名稱上的混亂,但還是機會較微,因為即使要採用Entity,都會使用回EF輸出的POCO classes。

但MVC專案情況下就有所不同,大家都知道,除了DBContext之外,一般我們還會在Models下建立類同的POCO classes (或可叫做DTOs, Data Transfer Objects),而到了EF6,更可以用Code First做Reverse Engineer 快速建立POCOs。
至於原因可以看看這裡 - Entity Framework classes vs. POCO




上述兩者不止內容相似,名稱都可以是相似甚至一樣,如果跟Webforms專案時一樣放在同一個Project下,那麼問題就出現了。



因為很大機會程式會出現錯誤訊息:
Schema specified is not valid.
Errors:
The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Address'.
Previously found CLR type 'NewMVC.Models.Address', newly found CLR type 'NewMVC.Database.Address'.

最簡單地說明原因是EF會忽略Namespace,而以Class Name做Table Mapping,更詳細的解釋,可以看看CodePlex上的回報。

解決方法就是以另一個Assembly去載入DBContext,換句話說,就是新建Class Library Project去把EntityFramework的DBContext跟本身的Models分離。

2013年4月12日星期五

Visual Studio 2012 Update 2 - ASP.NET 4.5 簡易 Friendly URLs

上一次的Visual Studio 2012 Update 1 沒有太大驚喜,至少跟ASP.NET沒有太大關係,但今次的Update 2就為ASP.NET帶來兩個新亮點,分別是正式官方支持的SignalRFriendly URLs framework

2013年3月14日星期四

EntityFramework的DbUpdateConcurrencyException與OptimisticConcurrencyException的解析和解決辦法

這幾天,工作上需要製作一個Data Grid型式的Edit Form做CRUD
技術上使用ASP.NET MVC4 / EntityFramework 5.0 / Scaffolding,因為一個小小低級錯誤,導致出現DbUpdateConcurrencyException,了解這個錯誤後,在此講解一下,順道亦介紹一下相關的OptimisticConcurrencyException

DbUpdateConcurrencyException
這是EF 5.0新增的Exception,如圖所示,這通常會出現在SaveChanges()的時候。

Exception Message :
中文 :
存放區更新、插入或刪除陳述式影響到非預期數目的資料列 (0)。這些實體載入之後可能被修改或刪除了。請重新整理 ObjectStateManager 實體。
英文 :
Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

原因 :
就如Exception Message所說,這個錯誤會出現在INSERT / UPDATE / DELETE,原因是出現非預期的Affected Row數目。
那我們就要想一想什麼原因會導致Affected Row是 "0"。

1. 遺失Primary Key
以我工作上的例子,MVC4 Scaffolding建立的View都是含@model keyword的strongly-typed view
理論上你按Submit ,Post form後,ActionResult應該都會做Model-Binding

但有時候,因為一些人為錯誤,就會導致接收的Model數值不完整。
例如我這個情況,把DropDownList設定disabled,Post form後,那就沒有CompanyID了。出現"0"是因為CompanyID是int Type預設值而已。
那EF 跟本找不到符合的紀錄,固然亦UPDATE不能,所以就回報"0"Rows了。



這情況亦會出現在UPDATE和INSERT的場景上,所以要多加注意。
但有時我們真的需要把DropDownList / TextBox等等設定為Disabled,那怎麼辦?
那跟ASP.NET Webforms時一樣,加上一個HiddenField吧。
Razor 方法:
@Html.HiddenFor(model => model.CompanyID)

2. 同時Parallel作業
這就是所謂的並行處理(Concurrency)。
舉一個簡單的例子,Ken開啟了某客戶的Edit Form,想把電話修改一下,開啟後,Ken離開了崗位,但Edit Form依然開著。
幾分鐘後,Cammy把這位客戶的資料刪除。
當Ken 回到崗位後,修改了客戶的電話,按儲存。
就會出現DbUpdateConcurrencyException了。
原因很明顯就是找不到紀錄。

OptimisticConcurrencyException
跟上面的同時Parallel作業很相似,但OptimisticConcurrencyException只會發生在UPDATE的時候。
兩位使用者同時修改同一項目,Ken更新電話,Cammy更新地址,只要數值正確,雙方都可以進行儲存。
只是如果Ken和Cammy都是更新電話的話,就要Handle OptimisticConcurrencyException這個Exception進行Resolve Conflicts。
可以看看下列兩條連結的做法,是不簡單的。

不過由此可以見到EF發展到5.0版本已經是一個功能強大,安全的Framework。

Handling Concurrency with the Entity Framework in an ASP.NET MVC Application
Handling Concurrency with the Entity Framework 4.0 in an ASP.NET Web Application

2013年2月26日星期二

Bootstrap Form Builder For ASP.NET MVC Scaffolding

先藉機說一說我與Scaffolding的話。

Scaffolding這玩意,早在我之前的工作上,需要寫Ruby on Rails已經玩過,當時在Aptana RadRails上工作,其實都幾莫名其妙的,很多地方都不明白。
到上年用ASP.NET 4當中的Dynamic Data技術,再到現在ASP.NET MVC4,一個Web程式中,總會有機會依賴到Scaffolding。

Scaffolding是什麼?
不論ASP.NET/PHP還是ROR,在MVC架構來說,Scaffolding其實是透過一個Data Model,去產生所需的Controller和View,
當中Controller含有一般CURD動作如Insert/Update/Delete/List/Detail等等,而View亦會自動化產生相應的HTML Form。
其中一個好處當然是可以很快捷就做到一個含有Edit/Delete/View的Grid列表程式。
但我必須說明,Scaffold出來的Form是給你再修改,完美它才使用,並不宜立即Production用。
可參考Why do RoR professionals NOT use Scaffolding?
唯ASP.NET Dynamic Data例外,因為Dynamic Data做的甚至比MVC4還要多。

之所以介紹這個Bootstrap Form Builder,除了Bootstrap是現在最火紅的CSS/UI Framework之外,其次就是無痛美化上述的View (HTML Form)。
有用過ASP.NET MVC Scaffold的人都知道,透過EF的Data Context會建立Strongly Typed Views
建立出來這個View可以說是白白豬,什麼Style都沒有。
所以透過Bootstrap Form Builder就可以立即變靚。



2011年7月18日星期一

ASP.NET MVC 3 簡體中文/繁體中文 參考文件

本來MSDN Document有多國語系一向都不足為奇,但這次ASP.NET MVC3的是人工翻譯,並不是機器翻譯,所以值得提示一下。

Chinese (Simplified): http://msdn.microsoft.com/zh-cn/library/gg416514(VS.98).aspx
Chinese (Traditional) http://msdn.microsoft.com/zh-tw/library/gg416514(VS.98).aspx

2011年1月5日星期三

ASP.NET–WebForms 與 MVC 之間的選擇

看了一篇很好的Blog文,完美解說如何選擇ASP.NET Webforms 或 MVC。
寫文的人是光頭佬Joe Stagner - MS Senior Program Manager,跟Scott Guthrie同樣出名,兩者都是掌管MS開發部門。

其實我個人見解是,Webforms已經出現了十年,在架構上已經很成熟,很完美,而Web Controls亦已經沒有太大發展空間,最多都只是出現如Ajax Control Toolkit這類蕓花一現的Controls。(說真的,比我選擇,我不想用它,效能不好,在IE上會很Lag。)
而ASP.NET 3.5出現的ListView Control已經把DataControl類別的自由性擴建到最大。

而且現在興用Javascript Framework,ASP.NET老手亦不會只依靠Drag&Drop Control去完成工作,所以Microsoft實在沒必要再在Controls上花時間。

在發展上,Microsoft亦唯有開發出另一個MVC架構去發展另一條路線。

情況就如PHP一樣,PHP本身可以不依靠任何Framework去工作,單單Post Form已經可以做到很多事情,但事實上很多人都用Zend / CakePHP / Codelighter去實現MVC。
為的都是想提升Application質素,盡量把Logic,Routine分離至Model / Controller上。

ASP.NET MVC的出現令人有爭議只是因為Webforms本身太好,有Code-Behind把HTML和Syntax分離,令很多人都認為不需要MVC。

但上述Blog文說得幾好,MVC出現是想把Client-Side的開發達到最明亮,所以沒有ViewState,亦不支持Web Control。

其實沒有必要偏向任何一方,兩者都是相輔相成,一起學好去就最好喇,因為學好MVC都可以應用在很多地方,例如iPhone Dev,ROR,PHP等。

Choosing between ASP.NET–WebForms, MVC, WebMatrix – Choice is a GOOD thing.
http://msjoe.com/blog/posts/choosing-between-asp-net-ndash-webforms-mvc-webmatrix-ndash-choice-is-a-good-thing/

2010年4月22日星期四

ASP.NET MVC Open Source Forum Application

三個ASP.NET MVC Base的Forum,而且還是Open Source。

OpenForum - MVC Forum
這個比較Basic,基本上只是Visual Studio的MVC Template加Forum功能。但作為學習MVC是不錯的選擇。
http://openforum.codeplex.com/


Telerik MVC Forum
完成度很高的forum。
http://demos.telerik.com/mvc/forums
Source Code : http://demos.telerik.com/mvc/mvc-forum.zip



mesoBoard
如果要用作Production,這個應該是首選,因為介面比較好,而且功能也比較多。
live preview : http://mesoboard.com/Board

2009年8月20日星期四

ASP.NET MVC - Some Frequently Asked Questions

這個國外網站".NET咖哩"有很多不錯的文章,與Code-Project和DZone相當。

ASP.NET MVC - Some Frequently Asked Questions
This article introduces ASP.NET MVC and answers some frequently asked questions about ASP.NET WebForms vs ASP.NET MVC.
http://www.dotnetcurry.com/ShowArticle.aspx?ID=370

2009年3月26日星期四

ASP.NET MVC Framework

ASP.NET MVC 出左 RTM,呢幾日玩過下,其實由Webforms去MVC是很大轉變,先要花不少時間了解MVC架構。上網睇左好多人討論,基本上都係對MVC一致讚好,更說學好.NET MVC對了解Ruby on Rails ,Spring, CakePHP都會很容易。
StackOverflow網站好多人都有疑問就係:(我應唔應該學ASP.NET MVC?) (Webforms同MVC有什麼分別?) 等等問題。
其實不足為奇既,Webforms開發者或者打開MVC Project時都覺得奇怪,分別有[Model]/[View]/[Controller] 三個Folder,而*.aspx頁沒有Code-Behind,Runtime時不會再自動Generate Client ID,沒有Post Back,一時間真是滿頭問題。

看看人家的文章,原來MVC架構下是沒有ViewState和Page Cycle,傳統Webforms是Event-driven,即是由Event (Page_init , Page_Load..) 去驅進頁面,但MVC中的View等同User Interface,透過Controller去決定return返什麼View,而Model就是business logic層面,由Controller再去Model執行事件,決定View如何演變。寫了Webforms那麼久,亦玩過PHP Post Form模式的運作,MVC的運作好像幾有趣。

mvc-architecture.png

當然我都未掌握到很多,而且香港的市場有排都不會興起ASP.NET MVC (當然我只是指ASP.NET的MVC,不包括ROR等等),但是做Web Development,我覺得是要懂MVC概念,以下是我看過的好網站,大家要MVC入門,可以一看。
睇緊期間,起CodingHorror搵到一篇文,是我之前講PHP中HTML夾碼大量Logic,Logic中又夾雜HTML,
原來是有名堂的 - 叫做Tag Soup

ASP.NET
ASP.NET MVC official site (MS把MVC放上主Menu中,可見很重視)
ASP.NET MVC Tutorials

stackoverflow (一個我經常看的討論區,經常有很多有趣的Programming問題。)
What Is ASP.Net MVC?
Is .NET MVC must learn technology?
ASP.NET MVC - Is it worth it yet?

ScottGu's Blog
ASP.NET MVC Framework
Free ASP.NET MVC eBook Tutorial
Other:
How to Learn ASP.NET MVC
Interest in ASP.NET MVC is raising
ASP.NET MVC - Is The Grass Really Greener?
New ASP.NET Architecture
ASP.net MVC Vs ASP.net Web Form
An Architectural View of the ASP.NET MVC Framework

中國cnblogs :
ASP.NET MVC 入門系列教程
http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303997.html
http://www.cnblogs.com/zhangziqiu/category/177895.html