2014-07-17 46 views
1

我有這樣的實體:複製實體內部視圖模型

public class MyEntity : IMergeable<Entities.EntityExample> 
{ 
    [Required]  
    public string Code { get; set; } 

    [Required] 
    public string Label{ get; set; } 

    public System.DateTime DateStart { get; set; } 
} 

我想複製它在視圖模型,將有一個名爲DateEnd第4財產。我在想這樣做:

namespace MyNamespace.ViewModels 
{ 
    public class ExampleViewModel 
    {  
     public ExampleViewModel(MyEntity myEntity) 
     { 
      myentity = myEntity; 
     } 

     public myEntity myentity { get; set; } 

     [Required] 
     public string DateEnd { get; set; } 
    } 
} 

這工作,但我的問題是,我的視圖模型將被安排在下列方式:

myViewModel.myentity.Code 
myViewModel.myentity.Label 
myViewModel.myentity.DateStart 
myViewModel.DateEnd 

當我真正想要的是:

或者至少(不太好):

myViewModel.myentity.Code 
myViewModel.myentity.Label 
myViewModel.myentity.DateStart 
myViewModel.myentity.DateEnd 
+2

請考慮https://github.com/AutoMapper/AutoMapper – tschmit007

+0

我會的,謝謝你 –

回答

2

您可能使剛剛訪問底層的實體屬性上的視圖模型屬性:

private myEntity _entity; 

public DateTime DateStart { 
    get { return _entity.DateStart; } 
    set { _entity.DateStart = value; }   
} 

但我真的只是創建一個新的視圖模型,然後使用類似automapper或一個普通的工廠向視圖模型轉換到您的實體。我想這是重複的,但實體 - >視圖模型是我從來不擔心的地方。

public class ViewModel 
{ 
    public string Code { get; set; } 
    public string Label{ get; set; } 
    public DateTime DateStart { get; set; } 
    public DateTime DateEnd { get; set; } 
} 

var entity = new myEntity { 
    Code = viewModel.Code, 
    Label = viewModel.Label, 
    DateStart = viewModel.DateStart 
    ... dont know what you want to do with DateEnd 
} 

但是,那麼你在哪裏以及如何處理驗證?你在你的實體上有註釋,所以你可以轉換爲實體,然後檢查實體的有效性,但是你將在DateEnd上失去驗證,因爲它不是實體的屬性。所以我會在視圖模型上添加驗證並在轉換爲實體之前檢查其有效性。

+0

非常感謝你,我學習你的答案。 –

2

你可以簡單地從你的實體繼承:

public class ExampleViewModel : MyEntity 
{  
    [Required] 
    public string DateEnd { get; set; } 
} 
+0

非常感謝,我會考慮你的方法。 –

+2

我個人更喜歡讓我的實體與我的視圖模型完全分離,所以我不太可能這樣做。來自@ tschmit007建議使用AutoMapper的評論是一個更好的主意,即使它需要更多的努力。 – DavidG