2011年9月27日 星期二

為什麼 MetadataType 與 EntityFramework 無法共同作業?

手動自行撰寫類別檔案,無法成功,必須利用精靈先建立類別,再編寫內容。

開發Web應用程式時,利用 EntityFramework來處理資料,利用 EF精靈建立了 UserDataModel.edmx (同時產生 UserDataModel.Designer.cs)

namespace 為 MvcSSOPortal.Models.UserData

EF精靈建立的 class 不要手動更改,否則重整時,手動部分皆會遺失。
又想享用 .Net 3.5 SP1提供的Data Annotations 的用法。

因為初學,想說從網路找個範例參考,就直接複製別人的源碼,然後用文字編輯器將其存成 UserDataModel.Metadata.cs,並跟 UserDataModel.edmx放在相同資料夾下。

接著在 VS2008中將其加入至專案,並手動修改 UserDataModel.Metadata.cs 如下(省略 using ...部分)

namespace MvcSSOPortal.Models.UserData
{
 [MetadataType(typeof(aspnet_Roles_MetaData))]
 public partial class aspnet_Roles
 {
 }

 public class aspnet_Roles_MetaData
 {
  //[Required(AllowEmptyStrings = false, ErrorMessage = "{0} 为必填字段")]
  //[NameValidation(ErrorMessage = "{0} 只能是數字")]
  //[System.Web.Mvc.HiddenInput(DisplayValue = true)]
  //public object ApplicationId { get; set; }

  [System.Web.Mvc.HiddenInput(DisplayValue = true)]
  public object RoleId { get; set; }

  //[Required]
  [DataType(DataType.Text)]
  [DisplayName("角色:")]
  public object RoleName { get; set; }

  //[Required]
  [DataType(DataType.Text)]
  [DisplayName("系統名稱:")]
  public object SysName { get; set; }

  //[Required]
  [DataType(DataType.Text)]
  [DisplayName("網址:")]
  public object URL { get; set; }

  //[Required]
  [DataType(DataType.Text)]
  [DisplayName("說明:")]
  public object Description { get; set; }
 }

 public class NameValidationAttribute : RegularExpressionAttribute
 {
  NameValidationAttribute()
  : base("^[0-9]*$")
  {}
 }
}


編譯時,並無錯誤,可是執行時卻沒有 Annotation 的效果,利用類別檢視器,查看也不見
NameValidationAttribute 此類別的存在,表示此檔案並未被編譯到(奇怪~~~)

後來將其重新命名,並自專案中移除!

另於 UserDataModel.edmx 的資料夾內利用精靈新增類別,由VS2008自動產生 UserDataModel.Metadata.cs

再從利用Notepad開啟之前被重新命名的檔案,將上面之程式碼複制,於VS2008中貼到UserDataModel.Metadata.cs,內容與上面程式面並無不同。

重新編譯、執行-->哈!哈! OK 啦!

利用類別檢視器也看到 NameValidationAttribute 此類別了!


為什麼會這樣??? 我也不知道,這是我試了好多方法之後找到的結果!

(之前手動建立的UserDataModel.Metadata.cs ,我試著:

變更 namespace
變更 public partial class aspnet_Roles (把 partial 拿掉、把aspnet_Roles更名)
變更 所在的資料夾(移到 Controllers、移到 App_code)
試著指定 aspnet_Roles 的繼承來源

可是編譯都沒有錯誤,但依舊沒有差別~~~無作用
)

沒有留言:

張貼留言