簡體   English   中英

EF T4模板-有條件地發出自定義屬性

[英]EF T4 Template - Conditionally emitting custom attributes

我在項目上使用EF 4.1“數據庫優先”。 使用T4模板,我有條件地用諸如Required,DisplayName,MaxLength之類的屬性裝飾生成的屬性。 在我的T4模板的WriteProperty方法中,我有類似以下內容:

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)的方法?

謝謝!

我認為您(可以)可以做到。 我沒有嘗試過,但是我相信,如果您在命名空間中將屬性添加到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文件中添加的所有注釋。

不,什么都沒有。 EF模型設計人員仍然無法使用自定義元數據擴展模型,甚至無法進行驗證。 您當然可以嘗試命名約定,也可以重新發明輪子並在旁邊添加您自己的元數據文件,但是目前更簡單的方法是手動為部分類編寫驗證屬性和元數據類型。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM