0

我正在使用連接到SQL Server數據庫以生成實體類的ADO.Net實體數據模型。實體框架的自動生成的類的代碼會在每次更新模型時生成

我創建生成的類部分類與此屬性:

[MetadataType(typeof(Employee))] 

DataAnnotations上的字段。因此,我從生成的類(.g.cs)中移除所有字段,並將它們移動到另一個分類並將數據註釋放入此類。

問題是每當我從數據庫更新模型時(無論我是從實體數據模型中刪除現有表還是隻刷新模型,生成的類代碼都會被重新生成,而且我必須再次手動刪除字段屬性從g.cs類,因爲它們已經存在於其他分部類(由MetadataType屬性指定的類)。

是否有可能,當我更新模型生成的代碼沒有得到再生,如果需要的話我可以手動再生特定表/類的代碼?

[MetadataType(typeof(Employee))] 
    public partial class Employee 
    { 
     public string badge_no { get; set; } 
     public string first_name { get; set; } 
     public string last_name { get; set; } 

     [Display(Name="Name")] 
     public string FullName { get { return first_name + " " + last_name; } } 

     [Display(Name = "Badge-Name")] 
     public string NameAndBadge { get { return badge_no + " " + FullName; } } 
    } 

這裏是g.cs文件(生成的文件)

public partial class Employee 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public Employee() 
     { 
      this.EmpWrkDesignations = new HashSet<EmpWrkDesignation>(); 
     } 

     public int id { get; set; } 
     //public string badge_no { get; set; } 
     //public string first_name { get; set; } 
     //public string last_name { get; set; } 
     public System.DateTime row_added_date { get; set; } 
     public Nullable<System.DateTime> row_changed_date { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<EmpWrkDesignation> EmpWrkDesignations { get; set; } 
    } 
+0

切勿觸摸生成的代碼,因爲它的性質將被生成並將覆蓋您所做的任何更改。 –

+0

該代碼由** T4模板**生成,您可以*根據自己的需要適應您的需要,如果您願意的話。所以是的,如果你想這樣做,你可以修改/修改你的EF T4模板* not *來生成基本實體類的任何屬性,因爲你在元數據類中指定了所有的東西。用於「EF T4代碼生成」的Google(或Bing) - 加載命中 –

+0

您可以先下載此NuGet包:'EntityFramework.CodeTemplates.CSharp',然後查看安裝到'CodeTemplates'文件夾中的兩個T4模板。當您運行「先從現有數據庫生成代碼」代時使用這些代碼。其他T4模板存在其他場景 –

回答

3

您正在使用MetadataTypeAttribute錯誤。您應該爲註釋創建一個單獨的類。

我有一個私人的內部類做到這一點,例如:

[MetadataType(typeof(Table1MetaData))] 
public partial class Table1 
{ 
    private class Table1MetaData 
    { 
     [MaxLength(20)] 
     public string Foo { get; set; } 
    } 
} 

重要的是,該元數據類的屬性名相同的部分之一。所以上面,是一樣的:

public partial class Table1 
{ 
    [MaxLength(20)] 
    public string Foo { get; set; } 
} 

你應該去的第一個。

此外,由於類是不是局部的,:

public string first_name { get; set; } 
public string last_name { get; set; } 

[Display(Name="Name")] 
public string FullName { get { return first_name + " " + last_name; } 

你可以和應該只寫你的財產:

[Display(Name="Name")] 
public string FullName { get { return first_name + " " + last_name; } 

結論:

  1. 僅限使用MetadataType用於將DataAnnotation Attribtues添加到生成的屬性中。
  2. 不要創建已經在分部類中生成的變量。如果你想給它一個屬性,參見1.

這就是說,如果你不舒服Entity Framework生成代碼的方式,你可以編輯T4模板。它隱藏在edmx文件後面(只需展開它)。


你沒問過,但你會跨越提前或推後傳來:

一個陷阱,如果你有自定義屬性,並希望得到他們,你需要檢查元數據太:

public static TAttribute GetAttributeOrUseMetadata<TAttribute>(this PropertyInfo element, bool inherit = false) where TAttribute : System.Attribute 
{ 
    //Find normal attribute 
    var attribute = element.GetCustomAttribute<TAttribute>(inherit); 
    if (attribute != null) 
    { 
     return attribute; 
    } 

    //Find via MetadataTypeAttribute 
    if (element.DeclaringType != null) 
    { 
     var metadataType = element.DeclaringType.GetCustomAttribute<MetadataTypeAttribute>(inherit); 
     var metadataPropertyInfo = metadataType?.MetadataClassType.GetProperty(element.Name); 
     return metadataPropertyInfo?.GetCustomAttribute<TAttribute>(); 
    } 
    return null; 
} 

MVC替代的,這將是自定義DataAnnotationsModelMetadataProvider