gpt4 book ai didi

entity-framework - EF Core 3 具有值(value)生成器

转载 作者:行者123 更新时间:2023-12-05 02:55:59 27 4
gpt4 key购买 nike

在实体的 modelBUilder 中,我尝试通过自定义生成器在添加和更新时设置创建和修改日期。走这条路的原因是因为创建模型的 DbContext 被用作基类。此基类由 SQL Server 和 SQLite EFCore 扩展继承。因此,上下文中应该有数据库显式功能。最初由 SQL Server 实现的 GetDateUTC() 和触发器。

modelBuilder.Entity<CommunicationSendRequest>(entity =>
{
...

entity.Property(p => p.CreatedAt).ValueGeneratedOnAdd().HasValueGenerator<CreatedAtTimeGenerator>();
entity.Property(p => p.ModifiedAt).ValueGeneratedOnUpdate().HasValueGenerator<ModifiedAtTimeGenerator>();

});

但是添加和更新两个属性总是设置为新值。意思是在全新的插入中设置了修改时间,在更新时设置了创建时间。这删除了 ​​true 创建日期。

CreatedAt and Modifiedat dates

问题是那些值生成器设置正确吗?有没有办法使用生成器来完成此操作?在生成器中,我还尝试检查状态并仅在添加或修改状态时才返回值。但状态始终等于分离。

 public class CreatedAtTimeGenerator : ValueGenerator<DateTimeOffset>
{
public override DateTimeOffset Next(EntityEntry entry)
{
if (entry == null)
{
throw new ArgumentNullException(nameof(entry));
}

return DateTimeOffset.UtcNow;
}

public override bool GeneratesTemporaryValues { get; }
}
public class ModifiedAtTimeGenerator : ValueGenerator<DateTimeOffset>
{
public override DateTimeOffset Next(EntityEntry entry)
{
if (entry == null)
{
throw new ArgumentNullException(nameof(entry));
}

return DateTimeOffset.UtcNow;
}

public override bool GeneratesTemporaryValues { get; }
}

最佳答案

我实际上所做的是完全摆脱 ValueGenerate 概念,处理它创建 CreatedAt、ModifiedAt,并在创建这篇文章后通过覆盖 SaveChanges() 方法添加 DeletedAt 日期。

 public override int SaveChanges()
{
var selectedEntityList = ChangeTracker.Entries()
.Where(x => (x.Entity is IEntityCreatedAt ||
x.Entity is IEntityModifiedAt ||
x.Entity is IEntityIsDeleted) &&
(x.State == EntityState.Added || x.State == EntityState.Modified)).ToList();

selectedEntityList.ForEach(entity =>
{
if (entity.State == EntityState.Added)
{
if (entity.Entity is IEntityCreatedAt)
((IEntityCreatedAt)entity.Entity).CreatedAt = DateTimeOffset.UtcNow;
}

if (entity.State == EntityState.Modified)
{
if (entity.Entity is IEntityModifiedAt)
((IEntityModifiedAt)entity.Entity).ModifiedAt = DateTimeOffset.UtcNow;

if (entity.Entity is IEntityIsDeleted)
if (((IEntityIsDeleted)entity.Entity).IsDeleted)
((IEntityIsDeleted)entity.Entity).DeletedAt = DateTimeOffset.UtcNow;
}
});

return base.SaveChanges();
}

关于entity-framework - EF Core 3 具有值(value)生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60909477/

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