EF Core .ToJson() 拥有的实体和更改跟踪

问题描述 投票:0回答:1

我正在努力从旧版 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);
}
c# json postgresql entity-framework-core
1个回答
0
投票

以下帖子(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;
}
© www.soinside.com 2019 - 2024. All rights reserved.