9 Stimmen

Enum aus Werten in einer Tabelle mit ADO.NET Entity framework generieren

Meine Anforderung ist es, eine Enum basierend auf Werten in einer Tabelle aus DB zu erstellen. Ich bin mit ADO.NET Entity Framework-Modell (.edmx-Datei), Kann jemand von Ihnen mir helfen.

10voto

Daniel Dyson Punkte 13116

Es ist wahrscheinlich viel einfacher, T4-Vorlagen zu verwenden. Hier ist ein wirklich guter Artikel über die ersten Schritte

In meinem Beispiel unten wird eine direkte SQL-Verbindung verwendet, aber wie Sie sehen können, können Sie jeden beliebigen Code einfügen und jede beliebige Ausgabe in eine cs-Datei generieren, die in Ihr Projekt kompiliert wird. Sie könnten die ADO-Syntax unten durch eine Aufzählung über eine Sammlung von Objekten ersetzen, die über Ihr Entituy Framework-Modell abgerufen werden, und entsprechend ausgeben.

Erstellen Sie eine Datei mit der Erweiterung .tt in dem Verzeichnis, in dem Sie die Aufzählungsdatei erstellen möchten. Wenn Sie die Datei XXXXX.tt nennen, wird eine Datei mit dem Namen XXXXX.cs generiert, also benennen Sie die tt-Datei entsprechend.

Versuchen Sie etwas in dieser Richtung. Sie müssen vielleicht ein wenig mit der Syntax und der Ausgabe experimentieren, aber ich werde nicht alles für Sie schreiben, sonst lernen Sie nichts :)

Beachten Sie jedoch, dass dieser Datenbankaufruf jedes Mal erfolgt, wenn Sie die tt-Datei bearbeiten.

<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Data" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#
    SqlConnection sqlConn = new SqlConnection(@"Data Source=XXXX;Initial Catalog=XXXX; Integrated Security=True");
    sqlConn.Open();
#>
namespace AppropriateNamespace
{
public enum YourEnumName
{
    <#
    string sql = string.Format("SELECT Id, Name FROM YourTable ORDER BY Id");
    SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
    IDataReader reader = sqlComm.ExecuteReader();

    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    while (reader.Read())
    {
        sb.Append(FixName(reader["Name"].ToString()) + " = " + reader["Id"] + "," + Environment.NewLine + "\t\t");
    }
    reader.Close();
    sqlComm.Dispose();
    #>
<#= sb.ToString() #>
    }
}

Versuchen Sie, dies zu verbessern. Anstatt in einen StringBuilder zu schreiben, geben Sie die Ergebnisse von jedem reader.Read() direkt in die Ausgabe. Außerdem habe ich eine FixName-Methode eingefügt, die es noch nicht gibt, die Sie aber vielleicht brauchen, um Leerzeichen oder unzulässige Zeichen zu entfernen.

7voto

Robert Koritnik Punkte 100480

Daniels Vorlage ist zwar schön und gut, aber ich habe mir etwas mehr Mühe gegeben eine solche Vorlage Also macht es all dies:

  • erzeugt Aufzählungswerte mit expliziten ganzzahligen Werten;
  • verwendet die Namespace-Namenskonvention von Visual Studio, so dass die generierten Aufzählungen den Standard-Namespace des Projekts mit angehängten Unterordnern haben (genau wie jede Codedatei in Visual Studio);
  • fügt eine vollständige XML-Dokumentation der Aufzählung hinzu, indem zusätzliche Spaltenwerte der Beschreibungstabelle verwendet werden; wenn Sie diese nicht haben, macht das nichts;
  • benennt die erzeugte Datei korrekt und fügt ein zusätzliches Attribut in den Code ein, damit die erzeugte enum nicht durch eine Code-Analyse überprüft wird;
  • die Werte von Nachschlagetabellen mit mehreren Wörtern werden korrekt mit den Entsprechungen in Pascal-Schreibweise verkettet (d.h.. Mehrwortwert wird ein MultiWordValue );
  • Aufzählungswerte beginnen immer mit einem Buchstaben;
  • alle Aufzählungswerte bestehen nur aus Buchstaben und Zahlen, alles andere wird ausgeschnitten;

Wie auch immer. Alles ist sehr gut dokumentiert in dieser Blogbeitrag .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X