2017-07-24 64 views
0

我有一個當前的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; } 

} 

我的問題在於在哪裏區分目標是否爲DIstance run或Weight Lost/Gained。我是正確的,還是應該重新考慮而不是使用模型?

+0

你做得對。它的重量或距離cos madel只是一個容器來暫時存儲數值,所以不需要在這裏指定重量或距離 –

回答

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

基於Entity Framework如何處理繼承,它實際上將實例化Distance/Weight依賴在哪一個實際保存。該屬性值將被upcasted到Metric,雖然如此,你需要投來訪問你的派生類的屬性:

if (goal.Metric is Distance) 
{ 
    var distanceRun = ((Distance)goal.Metric).DistanceRun; 
} 

你也可以簡單地使用as,然後檢查空:

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

將ID添加到區分不同類型的參考表中即可解決問題。我認爲從MVC方面來說,繼承不會起作用,因爲在回發時,框架不會知道要創建什麼類型的對象(例如Distance或Weight)。因此,雖然繼承可以像@Chris所建議的那樣工作,但在MVC方面,您需要一個具有一些識別值的組合對象來確定哪種類型的對象。這就是參考表可以派上用場的地方。或者,爲MVC端創建一個視圖模型,並且不直接加載和保存原始EF對象。這樣做會增加工作量,但可以確保UI設計不會糾纏數據庫設計。