2017-08-30 1 views
1

Ceci est une question d'exemple plus détaillé que j'ai demandé: Best Practice with classes and the databaseTransfert des tables de base de données aux classes/classes aux tables de base de données

J'utilise C# avec Sql Server et en utilisant Dapper comme mon ORM.

Voici mes tableaux: enter image description here

Voici ma classe qui charge la table de composants dans l'application:

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

Alors je besoin de mon autre classe qui aura les valeurs réelles:

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

La raison pour laquelle je fais cela est que je peux utiliser les valeurs pour une application WinForm avec des contrôles (liste déroulante) et d'autres besoins. De plus, la classe "DBComponent" aurait une méthode qui prendrait un objet "Component" et créerait un objet "DBComponent" qui serait renvoyé à la base de données en tant que nouvel enregistrement.

Est-ce la meilleure façon de gérer cette situation? Ou y a-t-il une meilleure méthode? Dans mon autre post quelqu'un a mentionné que dapper peut le faire par lui-même à l'endroit où je n'aurai pas besoin de créer 2 classes, seulement besoin d'une classe. Comment ça va?

+0

Vous pouvez utiliser des opérateurs implicites pour cela. Jetez un coup d'oeil ici: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit – Egbert

+0

@Egbert Je peux voir comment utiliser implicite pourrait être utilisé ici, je ne pense pas que je Je vais l'utiliser dans cette situation, mais j'aime le concept, je vais utiliser implicite dans d'autres parties de mon projet, merci! – jediderek

Répondre

1

Vous pouvez utiliser une seule classe et une seule requête pour charger vos données. C'est juste une question de construire la requête sql correcte et laissez Dapper faire sa magie dans le mappage des données récupérées dans votre classe Component.

Supposons que vous changez de classe de composant comme celui-ci

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

maintenant vous pouvez récupérer vos données en utilisant une bonne jointure entre les tables

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

Notez que j'ai renommé le composant membre à ComponentX parce que vous ne pouvez pas avoir un nom de membre portant le même nom que le type englobant

+0

Donc, techniquement, je n'aurais pas besoin d'avoir Color_ID et Material_ID dans la classe avec cette requête non? – jediderek

+0

Non, vous pouvez les éviter si vous le souhaitez, mais cela ne fait pas de mal de les avoir pour des utilisations futures. Bien sûr, vous n'affichez pas ces valeurs pour votre utilisateur, mais c'est juste un problème de votre interface utilisateur. – Steve

+0

Parfait! J'apprécie votre aide, C'était beaucoup plus facile que je pensais que ça allait être. Tout dépend de la requête. Merci! – jediderek