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文件的任何注释。