Mvc core edit action не сохраняется - PullRequest
0 голосов
/ 16 октября 2018

Итак, у меня есть этот пользовательский объект

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");
}

Хранилище и служба выполняют свою работу, ища пользователя по идентификатору и обновляя его значения, но когдаКонтроллер UserEdit все готово, мои изменения не сохраняются в базе данных.

Может кто-нибудь дать мне совет, как решить эту проблему?

1 Ответ

0 голосов
/ 16 октября 2018

EF полагается на внутреннее отслеживание изменений объекта, чтобы определить, какие операции ему нужно выполнить в базе данных.Все, что делает ваш Update метод - это вызывает SaveChanges, поэтому просто изменения, вносимые в сущность, по какой-то причине не отслеживаются, а когда вы вызываете SaveChanges, EF не видит работы, которую нужно выполнить, и просто возвращает.Что касается того, почему изменения вашей сущности не отслеживаются, здесь недостаточно вашего хранилища, чтобы сказать.

Однако я скажу, что это одна из первостепенных причин для , а не использования.шаблон хранилища с EF.Слишком просто делать вещи, которые мешают EF отслеживать изменения, и 99 раз из 100, это именно то, что делают разработчики.Когда вы используете ORM, например EF, означает, что - это ваш уровень данных.Он реализует репозиторий и единицы работы уже.Не каждый «слой» в вашей архитектуре должен принадлежать вам, и это критическая ошибка, которую допускают многие разработчики.Просто используйте ваш контекст напрямую.Вот для чего это.

Теперь пуристы могут утверждать, что у вас будет сильная зависимость от EF.Ну, угадай что?Вы делаете независимо.Вы выбрали его в качестве ORM, и это решение не должно и не должно быть легким.Что делать, если вы хотите выключить это с чем-то еще в будущем?Этот вопрос также всегда поднимается.Просто не будешь.Трения, возникающие при выключении чего-то вроде ORM, таковы, что оно никогда не станет бизнес-приоритетом.

Тем не менее, если вы хотите действительно абстрагировать зависимость, вам следует взглянуть на шаблонынапример, CQRS или микросервисы, которые, в отличие от избыточного и бесполезного уровня репозитория, действительно повышают ценность вашего приложения.Однако эти шаблоны сложны в реализации и излишни для большинства приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...