【问题标题】:Copying view model to data model将视图模型复制到数据模型
【发布时间】:2016-05-16 22:49:50
【问题描述】:

我正在尝试使用实体框架开发我的第一个 ASP.net MVC 项目。我没有使用任何视图模型,我在视图和数据库事务中使用相同的模型。这是事情,我有自定义用户表。在创建过程中,我的 User 模型中有 5 个东西:UserNameUserPasswordFullNameBranchBranchId(导航到另一个表)。但是当我想编辑用户时,我不需要 UserPassword 字段,因为现在无法更改密码。所以我创建了一个与User 模型相同的模型,除了名为UserEditUserPassword 字段。

在创建视图中我使用我的用户模型,在编辑视图中我使用用户编辑模型。在控制器中,我使用自动映射器并将值从User 复制到UserEdit 并将其返回以查看。一切正常,问题在于更新。

我正在尝试像这样更新用户:

    public bool Update(UserEdit userEdit) {
        User user = Find(userEdit.UserUsername);

        Mapper.CreateMap<UserEdit, User>();

        user = (User)Mapper.Map(userEdit, user, typeof(UserEdit), typeof(User));

        if (_modelState.IsValid)
        {
            _transactionManager.GetContext().Entry(user).State = System.Data.Entity.EntityState.Modified;
            _transactionManager.CommitTransaction();
            return true;
        }
        else
        {
            return false;
        }
    }

但它给了我这个错误:

附加信息:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

当我检查我要更新的用户时,我会在其中看到与实体框架相关的对象。所以我在想这个错误的原因可能是关于分支表和用户对象中的那些相关对象。我的用户对象中真的不需要那些与实体相关的对象。如果我只能复制模型中的属性,那就太好了。也许我做错了什么。因为我知道人们一直都在使用视图模型,所以应该有一个简单的方法来做到这一点。

有什么想法吗?

谢谢

【问题讨论】:

  • 在没有看到您的模型(数据和视图模型)的情况下无法提供帮助,但请检查所有属性是否正在更新。
  • 我其实说了我的模型怎么样,我的主模型上只有5个字段,视图模型是一样的,只是缺少密码字段。
  • 显示它们和视图(在视图模型中使用 BranchBranchID 是没有意义的)

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


【解决方案1】:

您真的不应该滚动自己的密码验证。使用 MVC 中内置的内容。也就是说,保存视图模型的最简单方法就是这样;

using (YourContext db = new YourContext())
{
  User u = db.User.Find(userEdit.UserUsername);
  db.Entity(u).State = System.Data.Entity.EntityState.Modified;
  u.FullName = userEdit.FullName;
  ....set the other properties here...

  db.SaveChanges();
} 

【讨论】:

  • 我可以这样做,但我认为使用 automapper 会更好。
  • Automapper 引入了额外的复杂性。它有它的位置,但是对于映射 5 个字段,我不会使用它。对于您的第一个项目,当您对模型有更好的了解时,请尽量使用 automapper。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多