私はEF 5.0を使用してPOCOエンティティを生成し、それを別のデータアクセスレイヤーで使用しています
全てのエンティティにタグ付けしたい【連載可能】
Serializable 属性を追加するためにテンプレートを変更するには?
私はEF 5.0を使用してPOCOエンティティを生成し、それを別のデータアクセスレイヤーで使用しています
全てのエンティティにタグ付けしたい【連載可能】
Serializable 属性を追加するためにテンプレートを変更するには?
テンプレートを編集したくない場合は、別のコード ファイルで編集することもできます。これは、partial
クラスの利便性のためです。したがって、ここのタイプがFoo
でBar
ありBaz
、My.Namespace
名前空間にある場合、同じプロジェクト内に別のファイルを作成できます。
using System;
namespace My.Namespace {
[Serializable] partial class Foo {}
[Serializable] partial class Bar {}
[Serializable] partial class Baz {}
}
[Serializable]
これは、属性を適用して、生成された半分とマージされます。partial
また、独自のメソッドを型に追加したり、テンプレートが宣言するメソッド実装の本体を提供したりすることもできます。
ただし、注意する必要があります。[Serializable]
使用していることを示唆していますBinaryFormatter
。これは必ずしも良い候補ではありません。コントラクトベースのシリアライザーを検討することをお勧めします。DataContractSerializer
EFテンプレートに(具体的には[DataContract]
/ )の属性を出力するオプションがまだなかったら、私は非常に驚かれることでしょう[DataMember]
。BinaryFormatter
ソフトウェアのバージョンを変更すると、非常に問題になる可能性があります。
エンティティ フレームワーク 5.0 以降を使用する場合は、次のコードの間に [Serializable] タグを追加します。
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
(少なくとも) EF 6 に対して行うことは次のとおりです。
model.tt ファイルで、次の行を探します。
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))
);
}
次のように変更します。
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} " + Environment.NewLine + " {1} {2} partial class {3}{4}",
"[Serializable]",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
}
.tt ファイルを保存すると、エンティティ クラス ファイルが[Serializable]
属性を取得します。終わり。
そのための手順は次のとおりです。
1) ModelName.Entity.tt ファイルを開きます
2) このファイルで次の文字列を見つけます
<#=Accessibility.ForType(entity)
3) この行の上に [Serializable] と書くと、コードは次のようになります。
[Serializable]
<#=Accessibility.ForType(entity)
ファイルを保存し、エンティティ ファイルを開くと、desire タグが書き込まれていることがわかります。エンティティを再度生成する必要さえありません。
EF 6 の場合、.tt
ファイル内で次のコードを見つけてください。
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))
);
}
文字列プレースホルダーがあり、("{0} {1}partial class {2}{3}")
必要なものに変更できます