Entity Framework
.t4 szablony w strukturze encji
Szukaj…
Dynamiczne dodawanie interfejsów do modelu
Podczas pracy z istniejącym modelem, który jest dość duży i jest często regenerowany w przypadkach, w których potrzebna jest abstrakcja, ręczne obejście remontowania modelu za pomocą interfejsów może być kosztowne. W takich przypadkach można dodać dynamiczne zachowanie do generowania modelu.
Poniższy przykład pokaże, jak automatycznie dodawać interfejsy do klas, które mają określone nazwy kolumn:
W swoim modelu przejdź do pliku .tt
zmodyfikuj metodę EntityClassOpening
w następujący sposób, to doda interfejs IPolicyNumber
do encji, które mają kolumnę POLICY_NO
, i IUniqueId
na UNIQUE_ID
public string EntityClassOpening(EntityType entity)
{
var stringsToMatch = new Dictionary<string,string> { { "POLICY_NO", "IPolicyNumber" }, { "UNIQUE_ID", "IUniqueId" } };
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}{4}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)),
stringsToMatch.Any(o => entity.Properties.Any(n => n.Name == o.Key)) ? " : " + string.Join(", ", stringsToMatch.Join(entity.Properties, l => l.Key, r => r.Name, (l,r) => l.Value)) : string.Empty);
}
Jest to jeden konkretny przypadek, ale pokazuje moc modyfikowania szablonów .tt
.
Dodawanie dokumentacji XML do klas jednostek
Do każdej wygenerowanej klasy modelu domyślnie nie są dodawane komentarze dokumentacji. Jeśli chcesz korzystać z komentarzy dokumentacji XML dla każdego generowanych klas encji, znaleźć tę część wnętrza [MODELNAME] .tt (MODELNAME jest obecna nazwa pliku EDMX):
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code); // used to write model namespace
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
Możesz dodać komentarze do dokumentacji XML przed UsingDirectives
, jak pokazano w przykładzie poniżej:
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
#>
/// <summary>
/// <#=entity.Name#> model entity class.
/// </summary>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
Wygenerowany komentarz do dokumentacji powinien zawierać nazwę jednostki, jak podano poniżej.
/// <summary>
/// Example model entity class.
/// </summary>
public partial class Example
{
// model contents
}