在ViewModel中复制实体

时间:2014-07-17 16:39:27

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

我有这个实体:

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

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

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

我想在ViewModel中复制它,它将有一个名为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.Code
myViewModel.Label
myViewModel.DateStart
myViewModel.DateEnd

或者至少(不太好):

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

2 个答案:

答案 0 :(得分:2)

您可以在视图模型上公开只访问基础实体属性的属性:

private myEntity _entity;

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

但我真的只是创建一个新的视图模型,然后使用automapper或普通工厂之类的东西将视图模型转换为您的实体。我想这是重复但实体 - &gt;视图模型是我从未担心过的地方。

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上失去验证,因为它不是您实体的属性。所以我会在视图模型上添加验证并在转换为实体之前检查其有效性。

答案 1 :(得分:2)

您可以直接从您的实体继承:

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