最近項目想做一個員工統一工號生成的系統,本來可以直接讓別的同事來做的,不過大家都在項目上忙不開,剛好也可以練練手於是就接過這個項目。之前雖然一直對MVC和Entity Framework有點了解,但是實際使用的時候還是有很多問題。本文是記錄在項目開發過程中遇到的第一手問題及解決辦法。
1. DataContext的選擇
遇到的第一個問題就是DtaContext的選擇,之前以為根據生成的EDMX就可以直接選擇Model生成Controller及View了。 不知道還需要Data context。好吧,初步查了一下Data Context是相關的底層數據連接、數據集定義的。
所以在生成Controller 的時候就選擇表的類及創建時生成的Entity即可。
2. 數據校驗
MVC提供了比較多的數據校驗功能,但是很多提示是英文的
[DataType(DataType.Text)]
[IDCardCheck]
[Display(Name = " 身份證號 ")]
public string PersonalID { get; set; }
一個簡單辦法就是聲明ErrorMessage值,輸入中文的錯誤提示信息。
如果需要自定義的驗證的話,如上代碼中的IDCardCheck,可以繼承ValidationAttribute來實現
public class IDCardCheckAttribute : ValidationAttribute
{
CheckHelper checkHelper = new CheckHelper();
SSOEntities SSODB = new SSOEntities();
public override bool IsValid( object value)
{
if ( null == value)
return false;
try
{
string personalID = value.ToString();
if (checkHelper.CheckIDCard(personalID))
{
int count = ( from p in SSODB.t_UserInfo where p.PersonalID == personalID select p).Count();
if (count > 0)
{
ErrorMessage = " 該身份證號碼已存在! ";
return false;
}
}
else
{
ErrorMessage = " 請輸入正確的身份證號碼 ";
return false;
}
return true;
}
catch (Exception exp)
{
ErrorMessage = " 請輸入正確的身份證號碼 ";
return false;
}
}
}
3. 映射存儲過程
EDMX支持將存儲過程映射到實體類的添加、刪除、修改中。
映射之后調用的時候還是可以用類似於SSODB.t_UserInfo.AddObject(xxx);這種方式來調用但是實際執行的時候是執行存儲過程了。
3. 導入存儲過程方法
如果你想在存儲過程里直接使用存儲過程的方法,那么可以在Model Brower里的 Function Imports里導入存儲過程。
在代碼里直接使用:
SSODB.DeleteEmployee(id, currentUser);
4. CodeFirst 實現
EF4.1 開始引入了Model First/Database First/Code First 等功能,由於這個項目是在之前項目的項目上改過來的。所以沒有完全用Code First來做。不過在找解決辦法的過程中還是試了一下Code First。以下為 Code First相應的Model Class及Data Class的代碼:
{
[Key]
public int UserId { get; set; }
public string Name { get; set; }
public System.DateTime CreateTime { get; set; }
public Nullable CreateUser { get; set; }
public string status { get; set; }
public string Sex { get; set; }
public string PersonalID { get; set; }
public string StaffNumber { get; set; }
public Nullable EntryDate { get; set; }
public Nullable SequenceNumber { get; set; }
}
public class UserIDContext : DbContext
{
public UserIDContext()
: base( " UserIDInfoConnect ")
{
}
public DbSet UserIDInfos { get; set; }
}
Web.Config的配置
< add name ="UserIDInfoConnect" connectionstring ="data source=.\SQLEXPRESS;Integrated Security=SSPI;initial catalog=SSO;User Instance=true" providername ="System.Data.SqlClient" />
</ connectionstrings >
5. 代碼雲存儲
特別需要說明的是這次使用酷盤+TFS的方式來管理代碼。因為我在公司和家里總共有兩台電腦,家里的網絡又連不到TFS,因此需要代碼同步,但是用U盤拷來拷去的太不方便了。因此想到了用酷盤作為代碼文件的同步。當然我把數據庫文件也作為同步的項了。這樣在公司寫完代碼如果還想回家寫的話直接到家打開電腦即可。還有最重要的一點是酷盤有版本控制的功能。這個項目里由於我脫離了TFS開發了好長時間,后來想把最新的代碼遷到TFS上,倒騰了半天把好幾個重要的文件都給弄丟了。還好在酷盤的已刪除里找到了,不然就白努力了。
因此推薦給大家這個工具 訪問地址:http://kb.vc/qCgf (通過該鏈接訪問我可以增長點免費空間,感謝您的支持!),我使用過Dropbox/SkyDrive/微盤/快盤等幾個工具,覺得在國內訪問速度還有空間還是酷盤最好。
不過有一點需要提醒的是光有酷盤可能還是行。因為你無法為代碼生成結構化的版本,比較打標簽之類的。因此還要結合TFS來做代碼的管理。
6.總結
通過小一周的開發體驗覺得MVC+Entity Framework對於.NET 的Web開發來說還是強大了不少,當然由於開發時間緊以上的概念之外我可能說得不太准確,歡迎大家批評指證,以后得繼續努力學習。