EF生成コードのプロパティにカスタム属性を追加する方法はありますか?もっともらしい解決策として私が見ることができる唯一のことは、カスタムT4テンプレートを考え出すことでしょう。ただし、属性の性質上、EFプロパティごとに正しい属性パラメータを決定することは不可能です。
これを行うには、プロパティを反映したメタデータ型を指定し、単に属性として使用します。
[MetadataType(typeof(Dinner_Validation))]
public partial class Dinner
{}
public class Dinner_Validation
{
[Required]
public string Title { get; set; }
}
残念ながら、上記のアプローチはリファクタリングに対して脆弱です。もう1つの選択肢は、新しいPOCOエンティティを使用することです。私が言うことができる限りこれらは完全にコンパイル時コード生成を避けます。まだ使っていないので、落とし穴やトレードオフについてはコメントできません。
DesignerでもこれをEDMXファイルに追加できます。
<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)));
}