Asp.net 创建一个;“目标”;现有项目的跟踪程序

Asp.net 创建一个;“目标”;现有项目的跟踪程序,asp.net,asp.net-mvc,model-view-controller,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")]

我目前有一个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; }
}
我将如何为这些模型中的每一个创建一种类型的目标创建者。当我指的是目标时,我指的是“按y日期运行的x金额”

我会尝试一个可能的目标模型,其字段类似于:

目标:

public class Goal
{
    public int Id { get; set; }
    public virtual double goalValue { get; set; }
    public DateTime dateTime { get; set; }

}

我的问题在于如何区分目标是长跑还是减肥/增重。我的思路正确吗?还是应该重新考虑,不使用模型?

我建议使用继承。创建一个基类,如:

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; }
}
然后,让
距离
重量
都继承自此:

public class Distance : Metric
{
}

public class Weight : Metric
{
}
然后,您的
目标
可以有一个指向
度量的外键

public class Goal
{
   ...
   public virtual Metric Metric { get; set; }
}
根据实体框架处理继承的方式,它将实际实例化
距离
/
权重
,具体取决于实际保存的是哪个。但是,属性值将向上转换为
Metric
,因此您需要转换才能访问派生类上的属性:

if (goal.Metric is Distance)
{
    var distanceRun = ((Distance)goal.Metric).DistanceRun;
}
您也可以简单地将
用作
,然后检查空值:

var distance = goal.Metric as Distance;
if (distance != null)
{
    // do something with `distance`
}

将ID添加到区分不同类型的引用表中是问题的解决方案。我认为从MVC的角度来看,继承是行不通的,因为在回发时,框架不知道要创建什么类型的对象(例如距离或权重)。因此,虽然继承可以像@Chris建议的那样工作,但在MVC方面,您需要一个具有一些标识值的复合对象来确定对象的类型。这就是参考表可以派上用场的地方


或者,为MVC端创建视图模型,而不是直接加载和保存原始EF对象。这样做会增加工作量,但可以确保UI设计不会影响数据库设计。

您做得对。它的重量或距离无关紧要,因为madel只是一个暂时存储值的容器,所以使用当前符号不需要在这里指定重量或距离