gpt4 book ai didi

c# - 我可以在 SaveChanges() 中动态获取实体关系吗?

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

目标框架:netstandard2.0

Entity Framework 核心:2.2.6

我在 OnModelCreating 中有以下代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SlotOrder>(entity =>
{
entity.Property(e => e.Id).HasConversion(
v => v.ToString(),
v => new Guid(v));
});

modelBuilder.Entity<SlotOrderDetail>(entity =>
{
entity.Property(e => e.Id).HasConversion(
v => v.ToString(),
v => new Guid(v));

entity.HasOne<SlotOrder>()
.WithMany()
.HasForeignKey(c => c.SlotOrderId);
});
}

我不使用导航属性,需要在 SaveChangesAsync 中加载特定实体的所有关系。在我的例子中,如果实体是 SlotOrder,我需要确定它有一个子实体 SlotOrderDetail:

public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
ChangeTracker.DetectChanges();

var utcNow = DateTime.UtcNow;

var added = ChangeTracker.Entries()
.Where(t => t.State == EntityState.Added)
.Select(t => t.Entity)
.ToList();

added.ForEach(entity =>
{
if (entity is IAuditable auditable)
{
auditable.CreatedAt = utcNow;
auditable.UpdatedAt = utcNow;
}

// var relationships = ...
});

return base.SaveChangesAsync(cancellationToken);
}

知道怎么做吗?

最佳答案

关系元数据由 IForeignKey 提供界面。

给定一个 IEntityType ,您可以使用两种方法获取实体关系的信息 - GetForeignKeys它返回实体是从属的关系,并且 GetReferencingForeignKeys它返回实体是委托(delegate)人的关系。

在您的情况下,不要选择 .Entity 属性,使用 EntityEntry 可以让您通过 访问 IEntityType >元数据属性,例如

var addedEntries = ChangeTracker.Entries()
.Where(t => t.State == EntityState.Added)
.ToList();

addedEntries.ForEach(entry =>
{
if (entry.Entity is IAuditable auditable)
{
auditable.CreatedAt = utcNow;
auditable.UpdatedAt = utcNow;
}

var foreignKeys = entry.Metadata.GetForeignKeys();
var referencingForeignKeys = entry.Metadata.GetReferencingForeignKeys();
});

关于c# - 我可以在 SaveChanges() 中动态获取实体关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59749125/

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