2017-08-30 2 views
1

Dies ist ein detaillierteres Beispiel Frage, die ich gefragt habe: Best Practice with classes and the databaseÜbertragen von Datenbanktabellen für die Klassen/Klassen zu Datenbanktabellen

Ich verwende C# mit SQL Server und mit Dapper als meine ORM.

Hier sind meine Tabellen: enter image description here

Hier ist meine Klasse, die die Komponententabelle in die Anwendung geladen wird:

class DBComponent 
{ 
    public int ID { get; set; } 
    public string Component { get; set; } 
    public int Material_ID { get; set; } 
    public int Color_ID { get; set; } 
} 

Dann habe ich meine anderen Klasse müssen, dass die tatsächlichen Werte haben:

class Component 
{ 
    public int ID { get; set; } 
    public string Component { get; set; } 
    public string Material { get; set; } 
    public string Color { get; set; } 

    public Component(DBComponent C) 
    { 
     ID = C.ID; 
     Component = C.Component; 
     Material = //queries the Material Table passing in C.Material_ID and returning the Material Value 
     Color = //queries the Color Table passing in C.Color_ID and returning the Color Value 
    } 
} 

Der Grund, warum ich das tue, ist, damit ich die Werte für eine WinForm-Anwendung mit Steuerelementen (Combobox) verwenden kann und andere Bedürfnisse. Außerdem hätte die Klasse "DBComponent" eine Methode, die ein "Component" -Objekt annimmt und ein "DBComponent" -Objekt erstellt, das als neuer Datensatz an die Datenbank gesendet wird.

Ist dies der beste Weg, um mit dieser Situation umzugehen? Oder gibt es eine bessere Methode? In meinem anderen Post erwähnte jemand, dass Dapper dies selbst tun kann, wo ich nicht 2 Klassen erstellen muss, sondern nur 1 Klasse. Wie ist das so?

+0

Sie können implizite Operatoren dazu verwenden. Schauen Sie hier: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit – Egbert

+0

@Egbert Ich kann sehen, wie implizit hier verwendet werden könnte, glaube ich nicht Ich werde es in dieser Situation benutzen, aber ich liebe das Konzept, ich werde es in anderen Teilen meines Projekts verwenden, danke! – jediderek

Antwort

1

Sie können nur eine Klasse und nur eine Abfrage verwenden, um Ihre Daten zu laden. Es ist nur eine Frage, die richtige SQL-Abfrage zu erstellen und Dapper seine Magie beim Mapping der Daten, die zu Ihrer Component-Klasse abgerufen werden.

Angenommen, Sie Ihre Komponentenklasse wie diese jetzt

public class Component 
{ 
    public int ID { get; set; } 
    public string ComponentX { get; set; } 
    public int Color_ID { get; set; } 
    public int Material_ID { get; set; } 
    public string Material { get; set; } 
    public string Color {get;set;} 
} 

ändern können Sie Ihre Daten abrufen zwischen den Tabellen eine richtige verbinden mit

IEnumerable<Component> SelectComponents() 
{ 
    using (IDbConnection connection = OpenConnection()) 
    { 
     const string query = @"SELECT p.ID, p.Component as ComponentX, 
             p.Color_ID, p.Material_ID, 
             c.Color, m.Material 
           FROM Component p 
           JOIN Color c on p.Color_ID = c.ID 
           JOIN Material m on p.Material_ID = m.ID"; 

     return connection.Query<Component>(query, null); 
    } 
} 

Beachten Sie, dass ich das Mitglied Komponente zu ComponentX umbenannt haben, weil Sie können keinen Mitgliedsnamen mit dem gleichen Namen des umschließenden Typs haben

+0

Also technisch hätte ich Color_ID und Material_ID in der Klasse mit dieser Abfrage nicht brauchen, oder? – jediderek

+0

Nein, Sie können sie vermeiden, wenn Sie möchten, aber es tut nicht weh, sie für zukünftige Anwendungen zu haben. Natürlich zeigen Sie diese Werte Ihrem Benutzer nicht an, aber dies ist nur ein Problem Ihrer Benutzeroberfläche. – Steve

+0

Perfekt! Ich schätze deine Hilfe, das war viel einfacher als ich dachte, dass es sein würde. Alles hängt von der Abfrage ab. Vielen Dank! – jediderek

Verwandte Themen