Entity Framework Core: требуется отношение один-к-одному - PullRequest
1 голос
/ 26 апреля 2020

Сущности: 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; }
}

Правила отношений:

  1. Каждый Market имеет Address, а Market не может существовать без Address. Address требуется
  2. Пользователь не может удалить Address, принадлежащий Market
  3. Когда пользователь удаляет Market, его Address должен быть удален автоматически

Можно ли настроить вышеуказанное отношение с помощью Entity Framework Core и Fluent API?

Я читал об отношениях один-к-одному с EF Core и узнал, что мне нужно сказать, какой субъект является основным, а какой - зависимым. И я должен использовать Fluent API для этого.

Я пробовал два подхода:

  1. Рынок как основной: при таком подходе действует только правило 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. Любая помощь?

1 Ответ

0 голосов
/ 27 апреля 2020

Fluent API не должен быть в состоянии удовлетворить ваши текущие потребности, потому что ваши потребности contrary для нормальных потребностей.

В соответствии с обычными логинами c, Address - это основная таблица, это не присоединяться к таблице Market, поэтому при удалении данных таблицы Market вы не должны влиять на таблицу Address.

Однако, если вам необходимо удалить, у вас есть две другие альтернативы.

Первый - удалить соответствующие данные напрямую in the code logic after you delete the Market's data, вы можете получить адресные данные в соответствии с внешним ключом рыночных данных AddressId, а затем удалить его.

Второй Вы можете создать trigger в базе данных, чтобы при удалении рыночных данных соответствующие данные об адресе также удалялись, лог c совпадает с первым.

...