Hinzufügen benutzerdefinierter Eigenschaftsattribute im Entity Framework-Code

custom-attributes entity-framework

Frage

Gibt es eine Möglichkeit, den Eigenschaften von EF-generierten Code benutzerdefinierte Attribute hinzuzufügen? Das einzige, was ich als eine plausible Lösung betrachten kann, wäre eine T4-Vorlage. Aufgrund der Art des Attributs ist es jedoch nicht möglich, den korrekten Attributparameter pro EF-Eigenschaft zu bestimmen.

Akzeptierte Antwort

Sie können dies tun, indem Sie einen Metadatentyp angeben, der die Eigenschaften widerspiegelt und einfach für die Attribution verwendet wird.

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

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

Steve Smith bloggt hier darüber .

Leider ist der obige Ansatz für das Refactoring spröde. Eine weitere Option ist die Verwendung der neuen POCO-Entitäten. Diese vermeiden, soweit ich das beurteilen kann, die Codegenerierung während der Kompilierung. Ich habe sie noch nicht benutzt, daher kann ich keine Fallstricke oder Kompromisse eingehen.


Beliebte Antwort

Sie können dies zur EDMX-Datei hinzufügen, auch mit Designer:

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

Und ersetzen Sie 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)));
}

Mit:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum