所以,我有这个用户实体
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之后,我的更改未保存在数据库中。
有人可以给我一些解决此问题的建议吗?
答案 0 :(得分:1)
EF依靠内部实体更改跟踪来确定它需要在数据库中执行哪些操作。您的Update
方法所做的全部是调用SaveChanges
,因此由于某种原因,不会跟踪对实体所做的更改,并且当您调用SaveChanges
时,EF认为不需要执行任何工作做,然后返回。至于为什么不跟踪您的实体更改,这里没有足够的资料库可以说明。
但是,我想说这是不与EF一起使用存储库模式的首要原因之一。做那些让EF的变更跟踪感到烦恼的事情太容易了,而在100的情况中,有99倍是开发人员所做的。当您使用像EF这样的ORM时,那个是您的数据层。它已经实现了存储库和工作单元单元。并不是您的体系结构中的每个“层”实际上都必须归您所有,这是很多开发人员犯的一个严重错误。只需直接使用您的上下文。那就是它的目的。
现在,纯粹主义者可能会争辩说,您将对EF有严格的依赖性。好吧,你猜怎么着?你不管。您已将其选择为ORM,该决定并非也不应该轻易做出。如果您想通过其他方式将其切换出去怎么办?这个问题也总是被提出。简单地说,您不会。切换出ORM之类的摩擦导致从不成为业务优先事项。
尽管如此,如果您想真正地抽象依赖关系,则应该查看诸如CQRS或微服务之类的模式,它们与冗余且无用的存储库层不同,实际上确实为应用程序增添了价值。但是,对于大多数应用程序来说,这些模式实施起来很复杂,并且过分杀伤力。