在Entity Framework代码中添加自定义属性属性

AKo*_*ran 26 entity-framework custom-attributes

有没有办法在EF生成的代码中为属性添加自定义属性?我唯一可以看到的是一个合理的解决方案是提出一个自定义的T4模板.但是,由于属性的性质,不可能为每个EF属性确定正确的属性参数.

Dre*_*kes 35

您可以通过指定镜像属性的元数据类型来执行此操作,并仅用于归因.

[MetadataType(typeof(Dinner_Validation))] 
public partial class Dinner 
{} 

public class Dinner_Validation 
{ 
    [Required] 
    public string Title { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

史蒂夫史密斯在这里写博客.

不幸的是,上述方法对于重构来说是脆弱的.另一种选择是使用新的POCO实体.就我所知,这些完全避免了编译时代码生成.我还没有使用它们,所以不能评论任何陷阱或权衡.

  • 反映时,`assembly.GetType(typeof(Dinner).ToString().GetProperties()`,`property.Attributes`为null,`property.GetCustomAttributes(typeof(RequiredAttribute))`返回一个零长度数组 - 应该是一个反映Dinner_Validation还是其他错误? (4认同)

小智 12

您可以将此项添加到EDMX文件中,还可以使用Designer:

<Property Name="Nome" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" >
            <Documentation>
              <Summary>[MyCustomAttribute]</Summary>
            </Documentation>
</Property>
Run Code Online (Sandbox Code Playgroud)

并取代T4:

void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{
    WriteProperty(Accessibility.ForProperty(edmProperty),
                  code.Escape(edmProperty.TypeUsage),
                  code.Escape(edmProperty),
                  code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                  code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
Run Code Online (Sandbox Code Playgroud)

附:

void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{
    if(edmProperty.Documentation != null && string.IsNullOrWhiteSpace(edmProperty.Documentation.Summary) == false)
    {
    #>
    <#=edmProperty.Documentation.Summary#>
<#+
    }
    WriteProperty(Accessibility.ForProperty(edmProperty),
                  code.Escape(edmProperty.TypeUsage),
                  code.Escape(edmProperty),
                  code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                  code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*pol 9

您可以在界面上创建界面和声明属性.

partial class Person : IPerson {}

public interface IPerson
{
    [Required]
    string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 作为未来读者的旁注,这不符合asp.net-mvc的验证. (2认同)