繁体   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