我正在努力从旧版 PostgreSQL JSON 列映射进行切换:
public class Order
{
public Guid Id { get; set; }
[Column(TypeName = "jsonb")]
public CustomerDTO Customer { get; set; }
}
到模型生成器上较新拥有的
.ToJson()
。进展顺利;但是,我还覆盖了我的 SaveChanges()
方法,用消息处理程序拾取的实体填充我的发件箱。
问题是,如果我修改我的
Customer
对象,Order
对象不会标记为已修改;然而,Customer
对象是。有没有一种简单的方法,无需遍历导航属性即可到达“父级”?在我的发件箱中,如果任何部分发生更改,我想要整个 Order
实体。
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
var entityEntries = base.ChangeTracker.Entries();
foreach (var e in entityEntries)
{
if (e.State == EntityState.Added || e.State == EntityState.Modified)
{
// Add to Outbox
}
}
return base.SaveChangesAsync(cancellationToken);
}
以下帖子(https://github.com/dotnet/efcore/issues/33442)有答案。
public static bool IsModified(this EntityEntry entry)
{
if (entry.State == EntityState.Added || entry.State == EntityState.Deleted) return false;
if (entry.State == EntityState.Modified) return true;
var tableName = entry.Metadata.GetTableName() ?? "";
var hasInnerChanges = entry.Context.ChangeTracker.Entries()
.Any(x => x.State != EntityState.Unchanged &&
x.Metadata.GetTableName() == tableName &&
x.Metadata.IsOwned() &&
x.Metadata.IsInOwnershipPath(entry.Metadata));
return hasInnerChanges;
}