gpt4 book ai didi

entity-framework - 带有 EF Core 2.1 和 Sql Server 的时间戳?

转载 作者:行者123 更新时间:2023-12-05 00:46:02 29 4
gpt4 key购买 nike

我想基本上在我的大多数表上都有一个“上次更新”列,以便我可以快速检查上次更新的时间。

现在我只是放了一个日期时间,每次我在我的 C# 代码中执行操作时,我都会保存新的日期时间来更新该字段。当然,这可能会导致我忘记这样做。

我想要更自动的东西。我真的不需要这个来进行审计,所以它不需要太先进。

我试过

builder.Property(x => x.RowVersion).IsRowVersion();

时间戳应该是什么,但是当我查看数据库时,我看到 0x00000000000007D1当我认为它看起来更像是一个日期时间。

编辑
 public class CompanyConfig : IEntityTypeConfiguration<Company>
{
public void Configure(EntityTypeBuilder<Company> builder)
{
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).ValueGeneratedOnAdd();
builder.Property<DateTime>("LastUpdated");
}
}

最佳答案

假设您定义了一个影子属性 LastModified对于您想要该功能的每个实体,如您的示例中所示

builder.Property<DateTime>("LastUpdated");

问题是如何自动更新它。

大卫的回答中描述的技术已经过时了。仍然可以覆盖 SaveChanges (和 SaveChangesAsync ),但恕我直言,有更好的方法,如 Populate Created and LastModified automagically in EF Core 所示.它是基于接口(interface)的方法,但可以轻松调整阴影属性(或任何属性 - 使用的方法适用于阴影和显式属性)。

快速回顾:从 v2.1 开始,EF Core 提供 State change events :

New Tracked And StateChanged events on ChangeTracker can be used to write logic that reacts to entities entering the DbContext or changing their state.



以下是您可以使用它们的方法。将以下内容添加到派生的上下文类中:
void SubscribeStateChangeEvents()
{
ChangeTracker.Tracked += OnEntityTracked;
ChangeTracker.StateChanged += OnEntityStateChanged;
}

void OnEntityStateChanged(object sender, EntityStateChangedEventArgs e)
{
ProcessLastModified(e.Entry);
}

void OnEntityTracked(object sender, EntityTrackedEventArgs e)
{
if (!e.FromQuery)
ProcessLastModified(e.Entry);
}

void ProcessLastModified(EntityEntry entry)
{
if (entry.State == EntityState.Modified || entry.State == EntityState.Added)
{
var property = entry.Metadata.FindProperty("LastModified");
if (property != null && property.ClrType == typeof(DateTime))
entry.CurrentValues[property] = DateTime.UtcNow;
}
}

并添加
SubscribeStateChangeEvents();

到您的派生上下文构造函数。

就这样。一旦上下文订阅了这些事件,它将在最初跟踪实体或其状态更改时收到通知。您只对 Modified 感兴趣和 Added查询实现未触发状态(如果您不需要 Added ,则只需将其从 if 条件中排除)。然后检查实体是否包含 DateTime LastModified使用 EF Core 元数据服务的属性,如果是,只需使用当前日期/时间更新它。

关于entity-framework - 带有 EF Core 2.1 和 Sql Server 的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55189195/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com