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

スティーブスミスはそれについてここにブログします

残念ながら、上記のアプローチはリファクタリングに対して脆弱です。もう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)));
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ