我有一个当前的MVC项目,基本方面已接近完成。该项目跟踪我在跑步和减肥过程中的进展,因为我发现很多应用程序有点臃肿。
我有一些基本模型:
距离:
public class Distance
{
public int Id { get; set; }
[DisplayName("Distance Run")]
public double DistanceRun { get; set; }
[DisplayName("Choose a date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime _Date { get; set; }
[DisplayName("Any Addtional Comments")]
public String AdditionalComments { get; set; }
}
重量:
{
public int Id{ get; set; }
[DisplayName("Current Weight")]
public double CurrentWeight { get; set; }
[DisplayName("Chose a date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime _Date { get; set; }
[DisplayName("Any Addtional Comments")]
public String AdditionalComments { get; set; }
}
我将如何为这些模型中的每一个创建一种目标创建者。当我的意思是目标时,我指的是“按日期运行的x金额”
我会尝试一个可能具有类似于以下字段的目标模型:
目标:
public class Goal
{
public int Id { get; set; }
public virtual double goalValue { get; set; }
public DateTime dateTime { get; set; }
}
我的问题在于区分目标是DIstance run还是Weight Lost / Gained。我是在正确的路线还是我应该重新考虑而不是使用模型?
答案 0 :(得分:0)
我建议使用继承。创建一个基类,如:
public class Metric
{
[DisplayName("Chose a date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime _Date { get; set; }
[DisplayName("Any Addtional Comments")]
public String AdditionalComments { get; set; }
}
然后,让Distance
和Weight
继承自:
public class Distance : Metric
{
}
public class Weight : Metric
{
}
然后,您的Goal
可以拥有Metric
的外键:
public class Goal
{
...
public virtual Metric Metric { get; set; }
}
根据实体框架如何处理继承,它实际上将实例化Distance
/ Weight
,具体取决于实际保存的是哪一个。但是,属性值将上传到Metric
,因此您需要强制转换才能访问派生类的属性:
if (goal.Metric is Distance)
{
var distanceRun = ((Distance)goal.Metric).DistanceRun;
}
您也可以使用as
然后检查null:
var distance = goal.Metric as Distance;
if (distance != null)
{
// do something with `distance`
}
答案 1 :(得分:0)
向区分不同类型的引用表添加ID是问题的解决方案。我认为从MVC方面来说,继承不起作用,因为在回发时,框架将不知道要创建什么类型的对象(例如距离或权重)。因此,虽然继承可能像@Chris建议的那样工作,但在MVC方面,您需要一个具有一些识别值的复合对象来确定哪种类型的对象。这就是参考表可以派上用场的地方。
OR,为MVC端创建视图模型,而不是直接加载和保存原始EF对象。这样做可以增加工作量,但可以确保UI设计不会妨碍数据库设计。