在EntityModel中填充ViewModel,在控制器中填充Vice Versa

时间:2015-07-08 18:03:48

标签: asp.net-mvc-5 entity-framework-6

我已经开始使用MVC一段时间了,我正在学习不同的方法来接近不同的场景。可以有不同的方式来处理单个场景,哪一个更有效,哪个更好。

我的困惑与实体模型和视图模型的使用有关。我为每个数据库实体创建了单独的实体模型,并为每个视图创建了单独的视图模型。现在我有一个简单的视图,包括文本框,单选按钮,复选框和下拉列表。我在视图上有两路数据绑定,我使用相同的视图来创建新记录和编辑现有记录。

我的困惑在于,我从数据库中检索实体模型,并从实体模型中填充ViewModel的每个字段,然后将ViewMoel传递给模型。现在必须手动为每个字段完成。那么ViewModel和实体模型是否有某种方式可以在运行时自动映射?例如,在一个简单的视图中,我正在执行以下操作,

List<User> UserList = db.Users.ToList();

        List<UserViewModel> UsersViewModel = new List<UserViewModel>();
        foreach (User user in UserList)
        {
            UserViewModel model = new UserViewModel();
            model.FirstName = user.FirstName;
            model.LastName = user.LastName;
            model.DOB = user.DOB;
            model.Addresses = user.Addresses;
        }

手动填充ViewModel后,我将其传递给视图。此外,为了将记录保存到数据库,我执行相反的操作并从ViewModel填充实体模型。对我来说,必须有一些更有效和更短的方式来做我正在做的事情。我在MVC4 C# Populating data in a viewmodel from database检查了一个类似的问题,但它没有回答我的问题而是解决了一些错误。

1 个答案:

答案 0 :(得分:2)

使用AutoMapper之类的工具。配置映射后,您可以填充视图模型,如下所示:

var user = db.Users.First();
var uservm = Mapper.Map<UserViewModel>(user);

var users = db.Users.ToList();
var usersvm = Mapper.Map<IEnumerable<UserViewModel>>(users);

通常,自动映射仅对于实体到视图模型是单向且安全的。仍然手动完成映射回实体类型。

至于您的手动示例,出于性能原因,您希望使用投影而不是迭代:

var users = db.Users.Select(u => new UserViewModel {
    FirstName = u.FirstName,
    LastName = u.LastName,
    ...
});