2016-10-02 15 views
0

私はExpenseと呼ばれるクラスを持っているとしましょう。タンク関連費用、修理費、航空券など、さまざまな種類の自動車関連費用を追加できます。費用の一部のプロパティは、費用、日付などのすべてのタイプで同じですが、いくつかの違いがあります。例えば:私は私の車に燃料を供給したとき、私は完全にタンクを満たしたかどうかのような情報を保存したい。しかし、修理費を節約するときには、他の情報を保存したい。柔軟なプロパティのメカニズム

問題は - どのように虚弱なプロパティのメカニズムを作成するのですか?

私が思いついたのは、2つのテーブル:expensesexpenses_propertiesです。 expenses表では、私はすべての基本的な、一般的なデータを保存でき、expenses_propertiesは構造以下のだろう。

| Id | PropertyName | PropertyValue | ExpenseId 
| 1 | IsFull  | "true"  |  1 
| 2 | Stuff  | "2016-10-02" |  1 

問題があり、PropertyValue列に私は例えばnvarcharのように、特定のタイプを使用しなければならないでしょう。この場合、これらの値を正しくソートすることはできません(たとえば日付別)。それとも、私はそうだろうか?

私はEntity Framework Code Firstアプローチを使用してこれを行うより良い方法があると思います。

+0

* Entity Attribute Value *の公用語を知っていれば、さらに調査することができます。私はそれがあなたを二度考えさせるだろうと確信しています。 –

+0

@Gert、ありがとう!研究は本当に私を2回考えさせました! –

答えて

1

私はあなたのクラス/オブジェクト・モデルを作成し、最初の(むしろ周りに他の方法よりも、すなわち、)データベースから始まる:

public abstract class ExpenseBase 
{ 
    public DateTime ExpenseDate { get; set; } 
    public double Cost { get; set; } 
} 

public class FuelExpense : ExpenseBase 
{ 
    public Boolean FilledUp { get; set; } 
} 

public class OtherExpense : ExpenseBase 
{ 
    public string SomeOtherProperty { get; set; } 
} 

その後inheritance mapping strategyを選択してください。このような状況では、通常、「Table per Concrete class」(TPC)を使用します。

0

費用の種類が異なる場合は、実際には異なるクラス(つまり異なるテーブル)を持つことが理にかなっています。 Expensesに共通データを格納し、次にTankExpenseの特定の "プロパティ"を列ExpenseIdと一緒に格納すると、ExpenseテーブルIDの外部キーにすることができます。あなたが費用のインスタンスを取得する必要がある場合、あなただけの取得でしょうかのEFを使用して、すべての関連費用が表示されます。

if (myExpense.TankExpense.Length > 0) 
{ 
    var isFull = myExpense.TankExpense[0].Full; 
} 
関連する問題