C'è un modo per aggiungere attributi personalizzati alle proprietà nel codice generato da EF? L'unica cosa che posso vedere come soluzione plausibile sarebbe quella di creare un modello T4 personalizzato. Tuttavia, a causa della natura dell'attributo, sarebbe impossibile determinare il parametro dell'attributo corretto per ogni proprietà EF.Aggiunta di attributi di proprietà personalizzati nel codice Entity Framework
risposta
È possibile eseguire questa operazione specificando un tipo di metadati che rispecchia le proprietà e viene utilizzato semplicemente per l'attribuzione.
[MetadataType(typeof(Dinner_Validation))]
public partial class Dinner
{}
public class Dinner_Validation
{
[Required]
public string Title { get; set; }
}
blog Steve Smith su di esso here.
Sfortunatamente l'approccio di cui sopra è fragile per il refactoring. Un'altra opzione è usare le nuove entità POCO. Questi evitano del tutto la generazione di codice compilato per quanto posso dire. Non li ho ancora usati, quindi non posso commentare eventuali insidie o compromessi.
Non credo che tu possa. Il generatore dichiara tutte le classi come parziali, permettendoti di estenderlo, ma non ti permetterà di contrassegnare le proprietà con attributi personalizzati dato che semplicemente genererà su di esse. L'unica cosa che puoi fare è scrivere le tue entità.
Questo può essere stato il caso, ma ci sono alcune opzioni al giorno d'oggi. Vedi la mia risposta per informazioni. –
È possibile creare un'interfaccia e dichiarare l'attributo sull'interfaccia.
partial class Person : IPerson {}
public interface IPerson
{
[Required]
string Name { get; set; }
}
Come nota a margine per i futuri lettori, questo * non * funziona con la convalida di asp.net-mvc. –
È possibile aggiungere questo al file di EDMX, con Designer anche:
<Property Name="Nome" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" >
<Documentation>
<Summary>[MyCustomAttribute]</Summary>
</Documentation>
</Property>
e sostituire 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)));
}
Con:
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)));
}
è possibile aggiungere questa al file EDMX, con Designer anche:
<Property Name="Nome" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" >
<Documentation>
<Summary>[MyCustomAttribute]</Summary>
</Documentation>
</Property>
e sostituire 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)));
}
Con:
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)));
}
E per Entity Framework 6, sostituire
public string Property(EdmProperty edmProperty)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
_code.Escape(edmProperty),
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
con
public string Property(EdmProperty edmProperty)
{
var description = String.Empty;
bool isAttribute = false;
if(edmProperty.Documentation != null &&
string.IsNullOrWhiteSpace(edmProperty.Documentation.Summary) == false)
{
string summary = edmProperty.Documentation.Summary;
if (!String.IsNullOrEmpty(summary) && summary.First() == '[' && summary.Last() == ']')
{
isAttribute = true;
}
if (isAttribute)
{
description = String.Format("\r\n\t{0}\r\n\t", summary);
}
else
{
description = String.Format("\r\n\t/// <summary>\r\n\t/// {0}\r\n\t/// </summary>\r\n\t",
summary);
}
}
return string.Format(
CultureInfo.InvariantCulture,
"{5}{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
_code.Escape(edmProperty),
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)),
description);
}
Avvertenze:
- namespace devono essere risolti in modo assoluto.
- Assume attributi iniziano con '[' e terminano con ']' - nessun altro controllo di errore
- Se un'apertura e parentesi graffa di chiusura non viene trovato, il riepilogo delle proprietà Entity Framework è avvolto in una tripla commento barra XML.
- Tenta di abbinare le informazioni di stile di visualizzazione visive predefinite (in realtà solo i trattini) che possono o meno essere il caso per il tuo progetto. Questo include nuove linee.Uscita
campione:
/// <summary>
/// content type
/// </summary>
public System.Guid ContentType { get; set; }
[System.ComponentModel.DisplayName("Last Modified")]
public System.DateTime LastModified { get; set; }
Oltre alla risposta di BurnsBA, Per applicare questo alle proprietà di navigazione troppo, aggiornare NavigationProperty()
così:
public string NavigationProperty(NavigationProperty navProp)
{
var description = String.Empty;
if(navProp.Documentation != null && string.IsNullOrWhiteSpace(navProp.Documentation.Summary) == false)
{
string summary = navProp.Documentation.Summary;
if (!String.IsNullOrEmpty(summary) && summary.First() == '[' && summary.Last() == ']')
{
description = String.Format("\r\n\t{0}\r\n\t", summary);
}
else
{
description = String.Format("\r\n\t/// <summary>\r\n\t/// {0}\r\n\t/// </summary>\r\n\t", summary);
}
}
var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType());
return string.Format(
CultureInfo.InvariantCulture,
"{5}{0} {1} {2} {{ {3}get; {4}set; }}",
AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)),
navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
_code.Escape(navProp),
_code.SpaceAfter(Accessibility.ForGetter(navProp)),
_code.SpaceAfter(Accessibility.ForSetter(navProp)),
description);
}
Io lo uso per aggiungere [Newtonsoft.Json.JsonIgnore]
al mio proprietà.
Nota: è necessario aggiungere questi per <...>Model.tt
e non <...>Model.Context.tt
- 1. Aggiunta di attributi alle classi generate dal database Entity Framework
- 2. Aggiunta di attributi [DataMember] [DataContract] in Entity Framework POCO Template
- 3. Aggiunta di una proprietà personalizzata a Entity Framework?
- 4. Aggiunta di attributi personalizzati a MSBuild Compito
- 5. Aggiunta di attributi personalizzati usando mono.cecil?
- 6. Attributi di proprietà personalizzati in Objective-c
- 7. C# Attributi personalizzati dalle proprietà
- 8. Entity Framework CTP5, codice prima. proprietà di navigazione opzionale
- 9. Ordinamento attributi colonna in Entity Framework
- 10. Entity Framework Proprietà virtuali
- 11. Aggiunta di attributi personalizzati a un asp: controllo CheckBox
- 12. Aggiunta e aggiornamento di entità con Entity Framework
- 13. Aggiunta di attributi di convalida a un modello di dati Entity Framework
- 14. Entity Framework 6 set stringa di connessione nel codice
- 15. Aggiunta di menu personalizzati nel testo sublime
- 16. Entity Framework 4.1 Proprietà virtuale
- 17. Aggiunta di attributi personalizzati a asp.NET Controllo RadioButton
- 18. Entity Framework - Crea proprietà di navigazione
- 19. Aggiunta di attributi personalizzati alla direttiva della pagina in asp.net
- 20. proprietà calcolate a Entity Framework
- 21. Aggiunta di attributi a un tipo derivato
- 22. codice di Entity Framework prima per Oracle
- 23. Aggiunta di istruzioni "GO" alle migrazioni di Entity Framework
- 24. Entity Framework - Prestazioni nel conteggio
- 25. Problemi con LinqPad Aggiunta di una connessione a Entity Framework
- 26. aggiunta di attributi a C# Proprietà set di parametri
- 27. Aggiunta di attributi aggiuntivi per ogni proprietà di una classe
- 28. i descrittori di proprietà javascript supportano attributi personalizzati?
- 29. Proprietà richieste su tipi complessi di Entity Framework facoltativi
- 30. Attributi personalizzati di tipo array
Mi stavo innamorando di EF quando improvvisamente mi sono reso conto che gli attributi delle mie entità sarebbero stati praticamente inesistenti a causa del modo in cui sono gestiti. Grrrr. – Chev
Riflettendo, 'assembly.GetType (typeof (Dinner) .ToString(). GetProperties()', 'property.Attributes' è null e' property.GetCustomAttributes (typeof (RequiredAttribute)) 'restituisce una matrice di lunghezza zero - dovrebbe uno riflette Dinner_Validation o è qualcos'altro? – lukiffer