2017-08-30 19 views
1

これは私が尋ねたより詳細な例の質問です:私は、SQL ServerとC#を使用して、私のORMとしてDapperのを使用していBest Practice with classes and the databaseデータベーステーブルにクラス/クラスにデータベーステーブルを転送

。ここで

は私のテーブルです:ここでは enter image description here

は、アプリケーションにComponentテーブルをロードする私のクラスである:

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

は、それから私は、実際の値を持つことになります私の他のクラスが必要:

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

私がこれをやっているのは、コントロール(コンボボックス)を使ってWinFormアプリケーションの値を使うことができるからです。その他のニーズ。また、 "DBComponent"クラスには、 "Component"オブジェクトを取得し、新しいレコードとしてデータベースに返送される "DBComponent"オブジェクトを作成するメソッドがあります。

これはこの状況を処理する最善の方法ですか?それとも良い方法がありますか?私の他のポストでは、誰かが2つのクラスを作成する必要はありませんどこにそれを行うことができますdapperは、1クラスだけが必要だと述べた。それはどうですか?

+0

暗黙の演算子を使用してこれを行うことができます。ここをクリックしてください:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit – Egbert

+0

@Egbertここで暗黙的に使用する方法を見ることができますが、私はこの状況でそれを使用しますが、コンセプトが大好きです。プロジェクトの他の部分で暗黙的に使用します。ありがとうございます! – jediderek

答えて

1

1つのクラスと1つのクエリを使用してデータをロードできます。正しいSQLクエリを作成してDapperに取得されたデータをComponentクラスにマッピングする際の魔法をさせるのは単なる問題です。

は今、あなたは私がするのでComponentXにメンバーのコンポーネントの名前を変更した適切なテーブル間の結合

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

お知らせを使用してデータを取得することができますが、この

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

のようなあなたのコンポーネントクラスを変更すると仮定囲みタイプと同じ名前のメンバー名を持つことはできません。

+0

技術的には、そのクエリの権限を持つクラスでColor_IDとMaterial_IDを持つ必要はありませんか? – jediderek

+0

いいえ、あなたが好きならそれらを避けることができますが、将来の使用のためにそれらを持つことを傷つけることはありません。もちろん、その値はユーザーに表示されませんが、これはUIインターフェイスの単なる問題です。 – Steve

+0

パーフェクト!私はあなたの助けに感謝します、これは私がそれが起こっていると思ったよりもずっと簡単でした。それはすべてクエリに依存します。ありがとう! – jediderek

関連する問題