[英]Exclude property on update - Entity Framework
我正在尝试使 PUT 更新 ToDo,并且我想保留旧的“createdAt”字段而不是覆盖数据库,最好的方法是什么? 我目前正在使用 AutoMapper
[HttpPut("{id:int}")]
public async Task<ActionResult<ToDoDTO>> Put([FromRoute] int id, [FromBody] UpdateToDoDTO updateToDoDTO)
{
var exists = await unitOfWork.ToDoRepository.Exists(id);
if (!exists)
{
return NotFound();
}
var toDo = mapper.Map<ToDo>(updateToDoDTO);
toDo.Id = id;
unitOfWork.ToDoRepository.Update(toDo);
await unitOfWork.SaveAsync();
return Ok(mapper.Map<ToDoDTO>(toDo));
}
我的更新 DTO 没有收到“createdAt”,因此将日期时间重置为“0001-01-01T00:00:00”
public class UpdateToDoDTO
{
[Required(ErrorMessage = "Description is required")]
public string? Description { get; set; }
[Required(ErrorMessage = "Completed status is required")]
public bool Completed { get; set; }
}
public class ToDo : BaseEntity
{
public string? Description { get; set; }
public bool Completed { get; set; }
public List<Comment>? Comments { get; set; }
}
public class BaseEntity
{
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
我有这段代码要在“SaveAsync()”function 中运行以更新“updatedAt”字段
public async Task SaveAsync()
{
AddTimestamps();
await context.SaveChangesAsync();
}
private void AddTimestamps()
{
var entities = context.ChangeTracker
.Entries()
.Where(x => x.Entity is BaseEntity && (x.State == EntityState.Added || x.State == EntityState.Modified));
foreach (var entity in entities)
{
if (entity.State == EntityState.Added)
{
((BaseEntity)entity.Entity).CreatedAt = DateTime.UtcNow;
}
((BaseEntity)entity.Entity).UpdatedAt = DateTime.UtcNow;
}
}
您可以查看Date/time value generation 。 我未能使ValueGeneratedOnAddOrUpdate
工作,但对于ValueGeneratedOnAdd
的 ValueGeneratedOnAdd,以下似乎工作得很好:
modelBuilder.Entity<Post>()
.Property(post => post.CreatedOn)
.HasDefaultValueSql("now()")
.ValueGeneratedOnAdd()
.Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore); // prevents manual overrides
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.