2016-10-02 76 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; 
}