Я использую 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);
}
Вы можете автоматизировать это с помощью триггеров sql. stackoverflow.com/questions/28988885/…
В действии 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 не обновляется.
Если вы хотите обновить и другие поля, я обновлю ответ.
Вы можете либо переопределить метод
SaveChanges
в своемDbContext
, либо использовать перехватчик .