灵活的属性机制

时间:2016-10-02 16:13:13

标签: c# sql-server entity-framework ef-code-first

我们说我有一个名为Expense的班级。我可以添加各种类型的汽车相关费用 - 油箱费用,维修费用,门票等。一些费用属性对于所有类型,如成本,日期等都是相同的,但是有一些差异。例如:当我为我的汽车加油时,我想保存信息,就像我完全装满我的坦克一样。但是,当我保存修复时,我想保存一些其他信息。

问题是 - 如何创建某种灵活的属性机制?

我想出的是有两个表: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方法。

2 个答案:

答案 0 :(得分: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。我通常选择"每个混凝土课程表#34; (TPC)在这种情况下。

答案 1 :(得分:0)

如果有不同类型的费用,那么拥有不同的类(即不同的表)实际上是有意义的。您可以Expenses存储公共数据,然后TankExpense存储具有列ExpenseId的特定“属性”,其中可以是Expense表ID的外键。当您需要检索费用实例时,如果使用EF,您将只检索所有费用,并显示所有相关费用:

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