2016-10-02 62 views
0

比方說,我有一個類叫Expense。我可以添加各種類型的汽車相關費用 - 坦克費用,修理費用,車票等。費用的某些屬性對於所有類型(如成本,日期等)都是相同的,但是存在一些差異。例如:當我爲我的汽車加油時,我想保存信息,就像我完全填滿了我的坦克或不。但是,當我正在保存修復時,我想保存一些其他信息。靈活的財產機制

問題是 - 如何創建某種靈活的屬性機制?

我想出的是有兩個表:expensesexpenses_properties。在expenses表,我可以存儲所有基本的,常用的數據和expenses_properties將有以下結構:

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

的問題是,爲PropertyValue專欄中,我將不得不使用特定類型的,像nvarchar例如。在這種情況下,我將無法正確排序這些值(例如按日期)?或者,也許我會?

我認爲必須有更好的方式來使用實體框架代碼優先方法來做到這一點。

+0

如果你知道這個* Entity Attribute Value *的官方術語,你可以做一些進一步的研究。我相信這會讓你思考三次。 –

+0

@Gert,非常感謝!研究確實讓我思考了三次! –

回答

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。在這種情況下,我通常會選擇「每個具體類的表」(TPC)。

0

如果有不同類型的費用,那麼它有不同的類別(即不同的表格)是有意義的。您可以在其中存儲公用數據的地址爲Expenses,然後在TankExpense之處存儲特定的「屬性」,其中列ExpenseId可以是Expense表Ids的外鍵。當您需要檢索費用的情況下,你只會檢索,如果使用EF和所有相關的費用將出現:

if (myExpense.TankExpense.Length > 0) 
{ 
    var isFull = myExpense.TankExpense[0].Full; 
}