在Entity Framework代碼中添加自定義屬性屬性

custom-attributes entity-framework

有沒有辦法在EF生成的代碼中為屬性添加自定義屬性?我唯一可以看到的是一個合理的解決方案是提出一個自定義的T4模板。但是,由於屬性的性質,不可能為每個EF屬性確定正確的屬性參數。

一般承認的答案

您可以通過指定鏡像屬性的元數據類型來執行此操作,並僅用於歸因。

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

public class Dinner_Validation 
{ 
    [Required] 
    public string Title { get; set; } 
}

史蒂夫史密斯在這裡寫博客。

不幸的是,上述方法對於重構來說是脆弱的。另一種選擇是使用新的POCO實體。就我所知,這些完全避免了編譯時代碼生成。我還沒有使用它們,所以不能評論任何陷阱或權衡。


熱門答案

您可以將此項添加到EDMX文件中,還可以使用Designer:

<Property Name="Nome" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" >
            <Documentation>
              <Summary>[MyCustomAttribute]</Summary>
            </Documentation>
</Property>

並取代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)));
}

附:

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)));
}


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因