繁体   English   中英

更新时排除属性 - 实体框架

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM