我们说我有一个名为Expense
的班级。我可以添加各种类型的汽车相关费用 - 油箱费用,维修费用,门票等。一些费用属性对于所有类型,如成本,日期等都是相同的,但是有一些差异。例如:当我为我的汽车加油时,我想保存信息,就像我完全装满我的坦克一样。但是,当我保存修复时,我想保存一些其他信息。
问题是 - 如何创建某种灵活的属性机制?
我想出的是有两个表:expenses
和expenses_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 :(得分: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;
}