【问题标题】:EF Core ChangeTracker: Sets only CreatedAt field in dbEF Core ChangeTracker:仅在 db 中设置 CreatedAt 字段
【发布时间】:2021-12-26 14:50:27
【问题描述】:

我正在使用 ChangeTracker 来更新所有实体的日期。在我的情况下,字段“CreatedAt”仅在数据库中设置。 我还运行了调试模式,并且设置了两个属性。当我运行 SaveChangesAsync 时,数据库中的 ModifiedAt 仍然为空。在更新时,“已修改”字段也未设置。

你能看出我做错了什么吗?

public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
        var entries = ChangeTracker.Entries().Where(e => e.Entity is DateTimeInformation
                                                        && (e.State == EntityState.Added
                                                        || e.State == EntityState.Modified));
        foreach (var entityEntry in entries)
        {
            ((DateTimeInformation) entityEntry.Entity).ModifiedAt = DateTime.Now;

            if (entityEntry.State == EntityState.Added)
            {
                ((DateTimeInformation)entityEntry.Entity).CreatedAt = DateTime.Now;
            }
        }

        return base.SaveChangesAsync();
  }

我的日期时间类:

public abstract record DateTimeInformation
{
    public DateTime? CreatedAt { get; set; }

    public DateTime? ModifiedAt { get; set; }          
}

我的配置

public class TextEntityConfiguration : IEntityTypeConfiguration<PrePostText>
{
        public void Configure(EntityTypeBuilder<PrePostText> builder)
        {
            builder.HasKey(c => c.Id);
            builder.Property(c => c.Id).ValueGeneratedOnAdd();
            builder.Property(ci => ci.CreatedAt).ValueGeneratedOnAdd();
            builder.Property(ci => ci.ModifiedAt).ValueGeneratedOnAddOrUpdate();
            builder.Property(c => c.Name).HasMaxLength(50).IsRequired();
            builder.Property(c => c.Type).IsRequired();
            builder.Property(c => c.Content).HasMaxLength(512).IsRequired();
        }
 }

【问题讨论】:

  • ValueGeneratedOnAddOrUpdate() 需要database trigger 才能工作。另外,如果您在客户端填充它们,为什么要将 Created/Modified 属性配置为数据库生成?

标签: .net entity-framework-core


【解决方案1】:

好的,我自己找到了解决方案 :) 当您使用 e DatabaseGenerated 属性时,您只需要 ValueGeneratedOnAdd。在我的情况下,我不使用它,因为我覆盖了 SaveChangesAsync。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2022-11-12
    • 2021-07-14
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多