EF T4模板 - 有条件地发出自定义属性

时间:2013-03-12 12:03:38

标签: asp.net-mvc-3 entity-framework entity-framework-4 entity-framework-4.1 t4

我在项目中使用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?

谢谢!

2 个答案:

答案 0 :(得分: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文件中的任何注释。

答案 1 :(得分:0)

不,没有。 EF模型设计师仍无法使用自定义元数据扩展模型,甚至用于验证。您当然可以尝试命名约定或重新发明轮子并将自己的元数据文件添加到一边,但现在更简单的方法是手动为部分类编写验证属性和元数据类型。

我肯定会投票赞成在EF中添加此功能。