我有一个场景,我想添加一个实体(比如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
时,我无法让它工作。