为现有项目创建“目标”跟踪器

时间:2017-07-24 12:17:34

标签: asp.net asp.net-mvc model-view-controller

我有一个当前的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。我是在正确的路线还是我应该重新考虑而不是使用模型?

2 个答案:

答案 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; }
}

然后,让DistanceWeight继承自:

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设计不会妨碍数据库设计。