Ajout d'attributs de propriétés personnalisées dans le code Entity Framework

custom-attributes entity-framework

Question

Est-il possible d'ajouter des attributs personnalisés aux propriétés dans le code généré par EF? La seule chose que je peux considérer comme une solution plausible serait de créer un modèle T4 personnalisé. Cependant, en raison de la nature de l'attribut, il serait impossible de déterminer le paramètre d'attribut correct par propriété EF.

Réponse acceptée

Vous pouvez le faire en spécifiant un type de métadonnées qui reflète les propriétés et est utilisé simplement pour l'attribution.

[MetadataType(typeof(Dinner_Validation))] 
public partial class Dinner 
{} 

public class Dinner_Validation 
{ 
    [Required] 
    public string Title { get; set; } 
}

Steve Smith en parle ici .

Malheureusement, l'approche ci-dessus est fragile au refactoring. Une autre option consiste à utiliser les nouvelles entités POCO. Autant que je sache, cela évite la génération de code au moment de la compilation. Je ne les ai pas encore utilisées, je ne peux donc pas commenter les pièges ou les compromis.


Réponse populaire

Vous pouvez ajouter ceci au fichier EDMX, avec Designer également:

<Property Name="Nome" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" >
            <Documentation>
              <Summary>[MyCustomAttribute]</Summary>
            </Documentation>
</Property>

Et remplacez 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)));
}

Avec:

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

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow