Сбой 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());
}