首页 > 解决方案 > EF Core ChangeTracker:仅在 db 中设置 CreatedAt 字段

问题描述

我正在使用 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();
        }
 }

标签: .netentity-framework-core

解决方案


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


推荐阅读