【问题标题】:Populating ViewModel from EntityModel and Vice Versa in a controller在控制器中从 EntityModel 和 Vice Versa 填充 ViewModel
【发布时间】:2015-07-08 18:03:48
【问题描述】:

我已经开始使用 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 上检查了一个类似的问题,但它没有回答我的问题,而是解决了一些错误。

【问题讨论】:

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


    【解决方案1】:

    使用AutoMapper 之类的工具。配置映射后,您可以像这样填充视图模型:

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

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

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

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

    【讨论】:

    • 感谢您的友好回复。我已经在研究 AutoMapper 并确定它是否以两种方式工作。我明白你所说的。我仍然有一个困惑。如果我在实体模型中有一个 IEnumerable 字段,那么我如何在 ViewModel 中有相同的字段。我很困惑,因为如果用户实体中有 IEnumerable,那么我应该使用与 Internet 上的某些人使用 List 或 SelectList 相同的 IEnumerable。如果是这种情况,那么映射将如何完成。映射也将在运行时进行,或者我也可以使用一些注释吗?
    • 我的视图模型从不包含实体属性。所以UserViewModel 将包含AddressViewModels 的集合。为Address 配置映射后,复合视图模型类型应自动使用地址映射。实际上,我将大部分实体映射到DTOs,并且我的服务类从不将实体类型暴露给我的控制器或视图。
    • 谢谢。我明白了。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多