C# Mvc核心编辑操作未保存

C# Mvc核心编辑操作未保存,c#,asp.net-core,asp.net-core-mvc,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 S

所以,我有这个用户实体

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; }    
    }
}
存储库和服务正在按id查找用户并更新其值,但当UserEdit控制器完成后,我的更改不会保存在数据库中


有谁能给我一些建议来解决这个问题吗?

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

然而,我要说的是,这是不将存储库模式与EF一起使用的最重要原因之一。这是太容易做的事情,博克斯EF的变化跟踪,百分之九十九,这正是开发人员所做的。当您使用像EF这样的ORM时,这就是您的数据层。它已经实现了存储库和工作单元模式。并非架构中的每一个“层”都必须由您拥有,这是很多开发人员犯下的一个严重错误。直接使用上下文即可。这就是它的目的

现在,纯粹主义者可能会争辩说,你将对EF有一个严格的依赖。你猜怎么着?不管你怎么做。您选择它作为ORM,这个决定不会也不应该轻易做出。如果你想把它换成其他东西怎么办?这个问题也总是被提出来。简单地说,你不会。在关闭类似ORM的东西时所涉及的摩擦是这样的,它永远不会成为业务的优先事项


尽管如此,如果您想真正抽象依赖关系,您应该研究像CQR或MicroService这样的模式,它们与冗余和无用的存储库层不同,实际上为您的应用程序增加了价值。但是,这些模式实施起来很复杂,而且对于大多数应用程序来说都是多余的。

为什么标题中是洋葱架构,而这是简单的CRUD?@AdamWyżgoł只是想更具体一点跟踪的实体是更新的,但您正在尝试更新映射的viewmodel对象。使用viewmodel中的属性更新ToUpdate的属性。如果我在此处出错,请纠正我的错误,但使用存储库模式将使控制器和EF之间保持一定距离,因此您的整个应用程序不依赖EF,只有您的数据层/存储库不正确。存储库模式用于低级数据访问,例如实际的SQL查询字符串。在存储库中包装EF并不会神奇地消除依赖性。您仍然在代码中使用LINQ to实体等,如果您正在使用DI,并且您应该这样做,那么您仍然需要在您的repo中注入上下文,以便应用程序仍然知道这一点。无论如何,你的应用程序中仍然会有一个EF的引用,这是没有办法的。换句话说,它无法实现人们使用它的任何预期目标,而且它也是冗余的,只需要维护和测试更多的代码。存储库模式将数据上下文与控制器分离。依赖永远不会神奇地消失,您只需将它们移动到一个位置,使您能够以尽可能少的麻烦替换它们。从控制器直接使用EF意味着如果你决定放弃EF,你必须重写整个过程。另一方面,确保你在前面使用了正确的数据访问工具,这样你就不必在以后删除它们。
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");
}