ASP.NET Core MVC автоматизирует поля DateTime во время создания/обновления

Я использую ASP.NET Core MVC 8, EntityFramework Core, C# и SQL Server 2022.

Невозможно автоматизировать поля CreatedAt и UpdatedAt DateTime в моей базе данных во время операций создания/обновления.

Когда я выполняю операцию Create в первый раз, я хотел бы, чтобы поле CreatedAt было заполнено DateTime.UtcNow.

Когда я выполняю операцию обновления, я хотел бы ТОЛЬКО добавить значение DateTime.UtcNow в поле UpdatedAt. CreatedAt DateTime не должен изменяться в методе обновления, который изначально был создан в операции Create.

Я попытался вручную добавить значение CreatedAt в операцию Create, а также вручную добавить значение UpdatedAt в операцию Update. Значение CreatedAt добавляется во время операции создания, тогда как значение UpdatedAt равно NULL. Когда я выполняю операцию обновления, значение CreatedAt принимает значение NULL, а значение UpdatedAt заполняется.

public class Gallery

{
    public Guid Id { get; set; }
    public string Title { get; set; }
    public bool IsPrivate { get; set; }
    public string? AccessCode { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime? UpdatedAt { get; set; }
}
public class GalleryVM
{
    public Guid Id { get; set; }

    [Required(ErrorMessage = "Title is required")]
    [Display(Name = "Title")]
    [StringLength(50)]
    [MaxLength(50)]
    public string Title { get; set; }

    [Required(ErrorMessage = "IsPrivate is required")]
    [Display(Name = "Gallery is Private?")]
    public bool IsPrivate { get; set; }

    [Display(Name = "Access Code")]
    [StringLength(16)]
    [MaxLength(16)]
    public string? AccessCode { get; set; }

    public DateTime CreatedAt { get; set; }
    public DateTime? UpdatedAt { get; set; }
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(GalleryVM galleryVM)
{
    Gallery? galleryExists = _db.Galleries.SingleOrDefault(p => p.Title == galleryVM.Title);
    if (galleryExists != null)
    {
        ModelState.AddModelError("Title", galleryExists.Title + " " + "is already in the system.");
    }

    if (ModelState.IsValid)
    {
        var galleryObj = new Gallery();
        {
            galleryObj.Title = galleryVM.Title;
            galleryObj.IsPrivate = galleryVM.IsPrivate;
            galleryObj.AccessCode = galleryVM.AccessCode;
        }

        _db.Galleries.Add(galleryObj);
        _db.SaveChanges();
        TempData["success"] = "Gallery created successfully";
        return RedirectToAction("Index");
    }
    return View(galleryVM);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(GalleryVM galleryVM)
{
    if (ModelState.IsValid)
    {
        var galleryObj = new Gallery();
        {
            galleryObj.Id = galleryVM.Id;
            galleryObj.Title = galleryVM.Title;
            galleryObj.IsPrivate = galleryVM.IsPrivate;
            galleryObj.AccessCode = galleryVM.AccessCode;
        }

        _db.Galleries.Update(galleryObj);
        _db.SaveChanges();
        TempData["success"] = "Gallery updated successfully";
        return RedirectToAction("Index");
    }
    return View(galleryVM);
}

Вы можете либо переопределить метод SaveChanges в своем DbContext, либо использовать перехватчик .

Peppermintology 30.08.2024 20:06

Вы можете автоматизировать это с помощью триггеров sql. stackoverflow.com/questions/28988885/…

Jivopis 30.08.2024 21:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В действии Edit вам следует избегать создания нового объекта, поскольку он будет иметь CreatedAt по умолчанию и null UpdatedAt.

Вы можете просто получить существующую галерею и обновить определенные свойства.

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(GalleryVM galleryVM)
{
    if (ModelState.IsValid)
    {
        // fetch the existing gallery
        var galleryObj = _db.Galleries.FirstOrDefault(g => g.Id == galleryVM.Id);

        if (galleryObj != null)
        {
           // update these properties
           galleryObj.Title = galleryVM.Title;
           galleryObj.IsPrivate = galleryVM.IsPrivate;
           galleryObj.AccessCode = galleryVM.AccessCode;
           
           // assign a new value for updatedAt
           galleryObj.UpdatedAt = DateTime.UtcNow;
        }

        _db.Galleries.Update(galleryObj);
        _db.SaveChanges();
        TempData["success"] = "Gallery updated successfully";
        return RedirectToAction("Index");
    }
    return View(galleryVM);
}

Так как вас интересует только обновление updateAt. Ты можешь сделать это

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(GalleryVM galleryVM)
{
    if (ModelState.IsValid)
    {            
        var galleryObj = _db.Galleries.SingleOrDefault(g => g.Id == galleryVM.Id);

        if (galleryObj != null)
        {
          // There is no need to update the Id again

          galleryObj.Title = galleryVM.Title;
          galleryObj.IsPrivate = galleryVM.IsPrivate;
          galleryObj.AccessCode = galleryVM.AccessCode;
           // assign a new value for updatedAt
          galleryObj.UpdatedAt = DateTime.UtcNow;

          _db.Galleries.Update(galleryObj);
          _db.SaveChanges();
        }

       
        TempData["success"] = "Gallery updated successfully";
        return RedirectToAction("Index");
    }
    return View(galleryVM);
}

Я изменил FirstOrDefault на SingleOrDefault, так как галерея будет состоять из одного элемента.

Я также хотел бы обновить и другие поля. Я попробовал решение, которое вы опубликовали выше, даже если другие мои поля были обновлены, но безуспешно. Все остальные поля обновляются нормально, сообщений об ошибках нет, поле UpdatedAt не обновляется.

user18776105 30.08.2024 23:25

Если вы хотите обновить и другие поля, я обновлю ответ.

Esanju Babatunde 31.08.2024 00:37

Другие вопросы по теме