0

我在项目中使用 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 之类的自定义属性?

谢谢!

4

2 回答 2

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

于 2013-03-12T16:37:33.630 回答
0

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

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

于 2013-03-12T13:16:49.443 回答