2012-02-07 37 views
4

我有一個edmx模型從數據庫和metadata.cs創建。如何獲取服務器端的字段的字符串長度?

在客戶端中,.g.cs包括[StringLength(X)]屬性以及來自我的元數據的屬性。

我正在做一些服務器端驗證的平面​​文件導入,這是單獨的這些實體的客戶端編輯器。

我能夠應用我的範圍和正則表達式驗證,但我無法找到服務器上的StringLength屬性。有沒有人知道如何做到這一點,而無需在元數據屬性上手動複製StringLength屬性。

編輯:

下面是一些代碼:

服務器端的文件ProductService.metadata.cs:

internal sealed class PRODUCTMetadata 
{ 
    [Required] 
    [RegularExpression("[A-Z]+")] 
    [Display(Name = "Product Code", Order = 10)] 
    public string Product_code { get; set; } 
} 

客戶端Generated_Code \ NameSpace.Web.g.cs:

public sealed class PRODUCT 
{ 
    [DataMember()] 
    [Display(Name="Product Code", Order=10)] 
    [RegularExpression("[A-Z]+")] 
    [Required()] 
    [StringLength(8)] //This is what I want to know, but server side 
    public string Product_code 
    {...etc 
    } 
} 
+0

請指定客戶端和服務器下的含義是什麼?你有WCF服務,其他類型的服務或某種Web UI客戶端嗎? – 2012-02-07 14:23:54

+0

@OleksandrPshenychnyy它是服務器端ASP網站項目上的「支持Silverlight的WCF服務」。客戶端是Silverlight,這是自動生成的'.g.cs'文件所在的位置,這是正確的,但我無法從服務器代碼訪問該文件。 – weston 2012-02-07 14:27:59

+0

對不起,我沒有在Silverlight中進行過驗證。但總的來說,通過WCF服務使用相同的對象進行數據庫訪問和通信並不是一個好習慣。其實我不明白爲什麼edmx文件在客戶端上產生一些屬性?你的客戶是否可以直接訪問DB?這是服務器的責任。 – 2012-02-07 14:35:16

回答

2

我已經調查了一下這個問題,並且無法在互聯網上找到有關該主題的任何良好信息。那麼,我會在這裏說只是假設

如您所見,自動生成的客戶端代理代碼比服務器端代碼更具有屬性修飾。例如,您的實體具有來自實體模型的良好[StringLength(8)]屬性。在服務器端,自動生成的.metadata.cs文件在實體上沒有這些屬性。 我認爲這都是關於代碼生成模板

我懷疑RIA服務的代碼生成模板(創建.g.cs文件)比在服務器端創建.metadata.cs文件的模板要完整得多。

的事實,即在你的情況下丟失的屬性是用於UI驗證在客戶端可以解釋爲什麼在.metadata.cs文件模板不生產這些驗證屬性95%的時間。

我看到您的問題2變通辦法:

1.編寫自己的元數據類在服務器端

一些示例:

[MetadataTypeAttribute(typeof(PRODUCT.PRODUCTMetadata))] 
public partial class PRODUCT 
{ 
    internal sealed class PRODUCTMetadata 
    { 
     // Metadata classes are not meant to be instantiated. 
     private PRODUCTMetadata() 
     { 
     } 

     [StringLength(8)] 
     public string Product_code { get; set; } 
    } 
} 

您可以手動添加任何屬性到實體的屬性,因爲實體是部分類。

不幸的是,你必須每次都維持這些metadatas您修改模型:如果(例如),從varchar(8)varchar(10)您的數據庫表列的變化,你就可以從自動更新您的EDMX型號搜索數據庫,但是您必須手動檢查您的元數據仍然正常(在此示例中,您必須手動將[StringLength(8)]替換爲[StringLength(9)])。

這是關於元數據的nice link

2.修改T4模板

第二個選項可能是最好的一個,但我沒有經歷過自己的代碼生成模板修改,所以我不知道什麼是可以有效地做或不該。

代碼生成模板被稱爲T4模板(Text Template Transformation Toolkit)。可以修改這些模板以在代碼生成過程中包含任何您想要的內容。您可以修改默認的EF模板,以便像RIA Services模板那樣生成缺失的屬性。

下面是關於T4代碼生成一些不錯的文章:


我寫這篇文章作爲一個答案(它不適合作爲評論),但記住它是所有的假設tions

+2

非常感謝,非常感謝您已經付出的努力!我會看看修改模板:) – weston 2012-02-09 11:15:17