【发布时间】: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