加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 实体框架:ViewModel到域模型

发布时间:2020-12-16 07:32:15 所属栏目:asp.Net 来源:网络整理
导读:我正在建立一个MVC 3网站.我有一个看起来像这样的模型: public class Survey{ [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } public string Name { get; set; } public string Description { get; set; } pub
我正在建立一个MVC 3网站.我有一个看起来像这样的模型:

public class Survey
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public DateTime DateStart { get; set; }

    public DateTime DateEnd { get; set; }

    // Not in view
    public DateTime DateCreated { get; set; }

    // Not in view
    public DateTime DateModified { get; set; }
}

基于此,我还有一个View Model来编辑调查信息:

public class SurveyEditViewModel
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public DateTime DateStart { get; set; }

    public DateTime DateEnd { get; set; }
}

当用户完成编辑时,我希望保留更改.这是我的控制器发布动作:

[HttpPost]
    public ActionResult Edit(SurveyEditViewModel model)
    {
        // Map the view model to a domain model using AutoMapper
        Survey survey = Mapper.Map<SurveyEditViewModel,Survey>(model);

        // Update the changes
        _repository.Update(survey);

        // Return to the overview page
        return RedirectToAction("Index");
    }

在我的存储库(它现在是通用的)我有以下代码:

public void Update(E entity)
    {
        using (ABCDataContext context = new ABCDataContext())
        {
            context.Entry(entity).State = System.Data.EntityState.Modified;
            context.SaveChanges();
        }
    }

执行此操作时,我收到以下错误:“存储更新,插入或删除语句影响了意外的行数(0).实体可能已被修改或删除,因为实体已加载.刷新ObjectStateManager条目.”

我想这是可以预料的.从视图模型到模型的映射不会给我一个完整的Survey对象.

我可以修改我的控制器看起来像这样.然后它的工作原理:

[HttpPost]
public ActionResult Edit(SurveyEditViewModel model)
{

    // Map the model to a real survey
    survey = _repository.Find(model.Id);
    survey.Name = model.Name;
    survey.Description = model.Description;
    survey.DateStart = model.DateStart;
    survey.DateEnd = model.DateEnd;

    // Update the changes
    _repository.Update(survey);

    // Return to the overview page
    return RedirectToAction("Index");
}

但我想知道是否有更好的方法可用?

解决方法

[HttpPost]
public ActionResult Edit(SurveyEditViewModel model)
{
    // Fetch the domain model to update
    var survey = _repository.Find(model.Id);

    // Map only the properties that are present in the view model
    // and keep the other domain properties intact
    Mapper.Map<SurveyEditViewModel,Survey>(model,survey);

    // Update the changes
    _repository.Update(survey);

    // Return to the overview page
    return RedirectToAction("Index");
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读