MVC核心编辑操作未保存

时间:2018-10-16 06:31:31

标签: c# asp.net-core asp.net-core-mvc

所以,我有这个用户实体

using System;
using System.Collections.Generic;
using System.Text;
using Transport.Data.Entities;

namespace Transport.Data.Entities
{
    public class User : BaseEntity
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public DateTime BirthDay { get; set; }
        public String Email { get; set; }
        public String UserName { get; set; }
        public bool IsActive { get; set; }
        public List<Viaje> Viaje { get; set; }    
    }
}

这是实体的ViewModel

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
using Transport.Data.Entities;
using Transport.Model.Infraestructure;

namespace Transport.Model.ViewModel
{
    public class ViajeViewModel : BaseViewModel
    {
        public string Route { get; set; }
        public string Destination { get; set; }
        public string Origin { get; set; }
        public int Price { get; set; }
        public DateTime DepartureTime { get; set; }
        public int UserId { get; set; }
        [ForeignKey("UserId")]
        public Viaje Viaje { get; set; }
        public List<User> User { get; set; }
    }
}

这是我的更新存储库

DataResult IRepository<T>.Update(T entity)
{
    DataResult result = new DataResult();

    try
    { 
        result.Data = entity;
        context.SaveChanges();
        result.Successfull = true;
    }
    catch (Exception ex)
    {
        result.LogError(ex);
        result.Successfull = false;
    }

    return result;
}

还有我的更新服务

public ServiceResult Update(Vm viewModel)
{
    ServiceResult serviceResult = new ServiceResult();

    var ToUpdate = this.Repository.GetById((int)viewModel.Id).Data;

    if (ToUpdate == null)
    {
        serviceResult.Success = false;
        serviceResult.ResultTitle = "ERROR: Record No Found";
        //serviceResult.Messages.Add(Error.GetErrorMessage(Error.RecordNotFound));

        return serviceResult;
    }

    var Entity = MapperHelper.Instance.Map<Vm, Ent>(viewModel);

    var result = this.Repository.Update(Entity);

    serviceResult.Success = result.Successfull;
    serviceResult.ResultTitle = (result.Successfull ? Error.GetErrorMessage(Error.CorrectTransaction) : Error.GetErrorMessage(Error.InternalServerError));
    //serviceResult.Messages.Add(result.Successfull ? "Updated" : "Failed");
    serviceResult.ResultObject = MapperHelper.
    Instance.Map<Ent, Vm>(result.Data);

    this.Repository.SaveChanges();
    return serviceResult;
}

这是我的更新用户控制器

[HttpPost("users/edit/{id}")]
public ActionResult UserEdit(UserViewModel userViewModel)
{
    var users = userService.Update(userViewModel).ResultObject;

    return RedirectToAction("Index", "Users");
}

存储库和服务正在执行其工作,通过ID查找用户并更新其值,但是在完成UserEdit Controller之后,我的更改未保存在数据库中。

有人可以给我一些解决此问题的建议吗?

1 个答案:

答案 0 :(得分:1)

EF依靠内部实体更改跟踪来确定它需要在数据库中执行哪些操作。您的Update方法所做的全部是调用SaveChanges,因此由于某种原因,不会跟踪对实体所做的更改,并且当您调用SaveChanges时,EF认为不需要执行任何工作做,然后返回。至于为什么不跟踪您的实体更改,这里没有足够的资料库可以说明。

但是,我想说这是与EF一起使用存储库模式的首要原因之一。做那些让EF的变更跟踪感到烦恼的事情太容易了,而在100的情况中,有99倍是开发人员所做的。当您使用像EF这样的ORM时,那个是您的数据层。它已经实现了存储库和工作单元单元。并不是您的体系结构中的每个“层”实际上都必须归您所有,这是很多开发人员犯的一个严重错误。只需直接使用您的上下文。那就是它的目的。

现在,纯粹主义者可能会争辩说,您将对EF有严格的依赖性。好吧,你猜怎么着?你不管。您已将其选择为ORM,该决定并非也不应该轻易做出。如果您想通过其他方式将其切换出去怎么办?这个问题也总是被提出。简单地说,您不会。切换出ORM之类的摩擦导致从不成为业务优先事项。

尽管如此,如果您想真正地抽象依赖关系,则应该查看诸如CQRS或微服务之类的模式,它们与冗余且无用的存储库层不同,实际上确实为应用程序增添了价值。但是,对于大多数应用程序来说,这些模式实施起来很复杂,并且过分杀伤力。