1

我剛加入一家新公司,我的經理也加入了,他想改變我們的計劃。基本上做他做的事情。我不知道有什麼區別,優點,缺點,限制和問題,如果有會any..here的樣品什麼是爲模型類創建元數據類和部分類的用法#

namespace Models //this is the model part of from edmx 
{ 
using System; 
using System.Collections.Generic; 


public partial class MyModelClass 
{ 
    public int ID { get; set; } 
    public Nullable<System.DateTime> PostDate { get; set; } 
    public string MyContent { get; set; } 
} 

} 

這是元數據:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 

    namespace Models 
    { 
     public class MyModelMetaData 
     { 
      //he wants all data annotation here 
      public int ID { get; set; } 
      public Nullable<System.DateTime> PostDate { get; set; } 
      public string MyContent { get; set; } 
     } 
    } 

這是部分:

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.Linq; 
    using System.Web; 

    namespace Models 
    { 
     [MetadataType(typeof(MyModelMetaData))] 
     public partial class MyModelClass or MyModelClassPartial 
     { 

      //He wants the programming algorithm to go here 
     } 
    } 

請賜教。他希望爲每個模型類別創建不同的元數據和部分類。

謝謝你..我需要一個答案,爲什麼..如果你認爲他的方法是好的..我會這樣做..但如果你認爲這將導致未來的問題和更多的編碼將涉及。 .i需要知道

+2

爲什麼不問他他 – pm100

+0

他沒有解釋..他只是想讓我們這樣做..coz這就是他如何學習它..他也是mvc的新手。 – CyberNinja

+0

好好思考一下。如果MyClass是自動生成的,併爲其添加數據註釋屬性。如果你改變模型會發生什麼? 我認爲他的建議在這種情況下是好的。 –

回答

0

我認爲一個用法可能是不污染主類。

例如,如果您有很多驗證屬性(使用dataannotation),並且您不想讓它們在主類中,那麼可以使用MetadataTypeAttribute

另一個用法是如果您的類是自動生成的,並且您需要向屬性添加一些裝飾(更多屬性)而不更改自動生成的代碼。

3

您每次保存EDMX時(或執行T4模板時)都會從數據庫生成第一個類,實體類。

這會導致包含EDMX下的public partial class MyClass的文件被重新生成。所以你不能改變它,因爲下次有人刷新表格或增加一個表格時,你的改變就消失了。

這就是爲什麼實體類爲部分產生:這樣你就可以創建其他部分相同的類做你的修改

但是,如果你想註釋您的實體與元數據屬性,則無法重新定義另一個分部類中的相同屬性:同一個名稱只能由一個類型的一個成員使用。所以,你不能做到這一點:

// Entity class 
public partial class FooEntity 
{ 
    public string Name { get; set;} 
} 

// User-created partial class 
public partial class FooEntity 
{ 
    [Required] 
    public string Name { get; set;} 
} 

因爲該代碼表示​​要在FooEntity類,它是不是有效的命名Name兩個屬性。

所以你必須想出另外一種方法來爲這個類型添加元數據。輸入[MetadataType]屬性。這可以通過創建一個新的類和相同的屬性作爲要註釋的類。在這裏,使用反射,元數據根據成員名稱解析。

所以,當你創建元數據類以上註釋:

public class FooEntityMetadata 
{ 
    [Required] 
    public string Name { get; set;} 
} 

您可以將其應用到用戶創建的部分:

// User-created partial class 
[MetadataType(typeof(FooEntityMetadata))] 
public partial class FooEntity 
{ 
} 

而且也,在後者的部分,你可以添加爲實體模型添加功能的成員。例如新([NotMapped])屬性和新方法。

+0

感謝這..因此分部類名稱應該不同於實體模型類名稱?因爲他改變了我的部分類名稱與實體的相同。加上名稱空間應該匹配模型'?這整個設置如何映射到模型? – CyberNinja

+0

當您在多個部分定義中分割一個類時,包含名稱空間的全名必須匹配,否則最終會生成兩個不相關的類。元數據類必須具有不同的名稱。我不知道你的意思是「如何映射到模型」。 – CodeCaster

+0

我明白了.....課堂偏好..我錯過了,很感謝.. – CyberNinja

相關問題