Сущности: Address
и Market
:
public class Address
{
...
// Navigation properties
public Guid MarketId { get; set; }
public Market Market { get; set; }
}
public class Market
{
...
// Navigation properties
public Guid AddressId { get; set; }
public Address Address { get; set; }
}
Правила отношений:
- Каждый
Market
имеет Address
, а Market
не может существовать без Address
. Address
требуется - Пользователь не может удалить
Address
, принадлежащий Market
- Когда пользователь удаляет
Market
, его Address
должен быть удален автоматически
Можно ли настроить вышеуказанное отношение с помощью Entity Framework Core и Fluent API?
Я читал об отношениях один-к-одному с EF Core и узнал, что мне нужно сказать, какой субъект является основным, а какой - зависимым. И я должен использовать Fluent API для этого.
Я пробовал два подхода:
- Рынок как основной: при таком подходе действует только правило 3. Я могу добавить
Market
без Address
(нарушает правило 1). Существующий Market
необходим для добавления Address
. И пользователь может удалить Address
, принадлежащий Market
(нарушает правило 2).
builder.Entity<Market>()
.HasOne<Address>(m => m.Address)
.WithOne(a => a.Market)
.HasForeignKey<Address>(a => a.MarketId)
.OnDelete(DeleteBehavior.Cascade);
Address
как основной: при таком подходе нарушается только правило 3. Пользователь не может добавить
Market
без
Address
, другими словами, для добавления
Market
необходим существующий
Address
. Пользователь не может удалить
Address
, который принадлежит
Market
, потому что в DeleteBehavior отношение было установлено как Restrict. Но если пользователь удалит
Market
, его
Address
не будет удален автоматически. API должен справиться с этим.
builder.Entity<Market>()
.HasOne<Address>(m => m.Address)
.WithOne(a => a.Market)
.HasForeignKey<Market>(m => m.AddressId)
.OnDelete(DeleteBehavior.Restrict);
Я не уверен, правильно ли я установил отношения или это просто ограничение EF Core. Любая помощь?