EF Core并在调用SaveChangesAsync()之前引用实体的ID



我有一个场景,我想添加一个实体(比如EntityA),但我也想在调用SaveChanges()之前将这个实体的详细信息(包括自动生成的ID)添加到Outbox实体中。这样我就可以在同一个事务中包装两个插入。

发件箱实体有一个名为AggregateId的字段,类型为string

EntityA自动生成ID字段类型为long

基本上每次我插入/更新EntityA(或EntityB, EntityC等),我还想添加一个发件箱实体。

我无法解决的是,如何做到这一点,以便当EntityA和Outbox实体都保存时,AggregateId使用新生成的EntityA ID填充。

var entityA = new EntityA()
{
// public long Id { get; set; }  //-- Auto-generated
// set other properties ...
};
_context.Entities.Add(entityA);
var outbox = new Outbox()
{
AggregateType = nameof(EntityA),
AggregateId = entityA.Id.ToString()
};
_context.Outboxes.Add(outbox);
// I even tried ...
// outbox.AggregateId = entityA.Id.ToString();
await _context.SaveChangesAsync();

我不认为这是一个外键设置我之后,因为AggregateId可以指EntityA, EntityB等,但我可能是错的。

是否有一种方法可以在EF Core中建立单向关系,以便EntityA引用ICollection<Outbox> Outboxes,但将Id(long)映射到AggregateId(string),因此允许我这样做…

entityA.Outboxes.Add(outbox);

如果正确构造了支持类,那么一切都可以正常工作。您不需要任何Id属性。EF本身构造正确的int EntityAId外键关系

public class EntityA
{
...
public ICollection<EntityB> SetOfBs { get; set; }
}
public class EntityB
{
...
public EntityB EntityA { get; set; }
}

var a = new EntityA();
var b = new EntityB() { EntityA = a };
context.Bs.Add(a)
context.SaveChangesAsync();

@ jeremylakeman的回复是这个问题的答案(https://stackoverflow.com/a/69356696/4139809)。

但是我确实需要在发件箱实体中添加另一个字段,该字段与实体Id的类型相同。当我的实体Id是long,外键字段是string时,我无法让它工作。

相关内容

  • 没有找到相关文章

最新更新