0

我在項目中使用EF 4.1「數據庫優先」。使用T4模板,我有條件地使用Required,DisplayName,MaxLength等屬性來裝飾我生成的屬性。在我的T4模板時,寫屬性方法裏面,我有這樣的:EF T4模板 - 有條件地發射自定義屬性

var maxLength = edmProperty.TypeUsage.Facets.Where(f => f.Name == "MaxLength").FirstOrDefault(); 
if (maxLength != null && maxLength.Value.ToString() != "Max") 
{#> 
    [MaxLength(<#= maxLength.Value #>, ErrorMessage = "<#=edmProperty.Documentation != null ? edmProperty.Documentation.LongDescription : edmProperty.Name #> cannot exceed <#=maxLength.Value #> characters.")] 
<#+} 

這個偉大工程,可以從EDMX推斷出的信息,但也有一些事情是定製的,只是不可用。

作爲示例,假設我想用自定義正則表達式類型屬性修飾EmailAddress屬性。如何自動「選擇」我的模型中的電子郵件地址字段並應用此屬性而不檢查屬性名稱?

有沒有辦法「擴展」EdmProperty或者添加自定義屬性,如IsEmailAddress?

謝謝!

回答

0

不,沒有什麼。 EF模型設計師仍然無法用自定義元數據來擴展模型,即使是驗證。您可以嘗試命名約定,或重新發明輪子並將您自己的元數據文件添加到一邊,但現在更簡單的方法是僅爲部分類手動編寫驗證屬性和元數據類型。

我肯定會投票支持在EF中添加此功能。

+0

這是不正確的。查看我的答案瞭解更多詳情 – Pawel 2013-03-12 16:38:01

1

我想你(種)可以做到這一點。我還沒有嘗試過,但我相信如果您將名稱空間中的屬性添加到Edmx文件,您將能夠通過元數據屬性訪問它。事情是這樣的:

<Property Name="ID" Type="Int32" Nullable="false" myNs:regex="xxx" xmlns:myNs="http://tempuri.org" /> 

然後你可以讀出這個值(假設你有EdmProperty):

var metadata = edmProperty.MetadataProperties.Single(p => p.Name == "http://tempuri.org:regex"); 
Console.WriteLine(metadata.Value); 

的唯一的問題是,每當你更新從數據庫中EDMX模型文件可能會被覆蓋,並且您可能會丟失放入edmx文件的任何註釋。