Сбой EntityHistory для собственного типа со ссылкой на другие объекты

Вот моя модель:

public class Investment : FullAuditedEntity<Guid>
{
    public string some_property { get; set; }
    public Address Address { get; set; }
}

public class Address : ValueObject<Address>
{
    [ForeignKey("CountryId")]
    public Country Country { get; set; }
    [Required]
    public int CountryId { get; set; }
    [ForeignKey("StateId")]
    public State State { get; set; }
    public string StateId { get; set; }
    [ForeignKey("DistrictId")]
    public District District { get; set; }
    public string DistrictId { get; set; }
    [ForeignKey("CommuneId")]
    public Commune Commune { get; set; }
    public string CommuneId { get; set; }
    [Required]
    public string City { get; set; }
    public string Street { get; set; }
}

Когда я пытаюсь создать новую инвестицию и сохранить ее в БД, ABP пытается определить, следует ли хранить изменения сущности в таблицах истории, но происходит сбой при попытке идентифицировать владельца (инвестиции) для принадлежащего ей объекта (адреса). Это потому, что ABP всегда берет первый внешний ключ (при условии, что это отношение к сущности-владельцу), но в моем случае первый внешний ключ - это отношение к некоторому другому объекту, поэтому значение "PrincipalToDependent" отсутствует, и действие сохранения прекращается:

Есть ли обходной путь для этого, или мы не можем хранить ссылки в собственном типе сущности?

1 ответ

Если кому-то нужен обходной путь, необходимо перезаписать внешний ключ по умолчанию для собственной сущности, чтобы мы передавали имя свойства, которое всегда будет на первой позиции в коллекции внешних ключей:

public class InvestmentConfiguration : IEntityTypeConfiguration<Investment>
{
    public void Configure(EntityTypeBuilder<Investment> configuration)
    {
        configuration.OwnsOne(typeof(Address), "Address", buildAction => buildAction.HasForeignKey("AInvestmentId"));
    }
}

затем в классе DBContext:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.ApplyConfiguration(new InvestmentConfiguration());
}

и результат:

Другие вопросы по тегам