Удалить родительский объект, когда дочерний объект удален ... Ищете лучший подход, если таковой имеется - PullRequest
0 голосов
/ 10 января 2020

У меня есть адрес объекта:

public Address {
  public Int32 Id { get; set; }
  public Collection<User> Users { get; set; }
  public Collection<Book> Books { get; set; }
}

, который используется во многих объектах (пользователь, книга, ...) с использованием внешнего ключа:

public User {
  public Int32 Id { get; set; }
  public Int32 AddressId { get; set; }
  public Address Address { get; set; }
}

public Book {
  public Int32 Id { get; set; }
  public Int32 AddressId { get; set; }
  public Int32 UserId { get; set; }
  public Address Address { get; set; }
  public User User { get; set; }
}

Когда я удаляю книгу Мне нужно удалить ее адрес ...

Когда я удаляю пользователя, я также удаляю его книги (у меня есть каскад удаления), поэтому мне нужно будет удалить как адрес пользователя, так и его адреса книг.

Удаление соответствующих адресов при удалении пользователя или книги является обратным каскадному удалению.

Поэтому я создал следующий запрос, который я запускаю после удаления пользователя или книги:

    IQueryable<Address> addresses = _context.Addresses
      .Where(x => 
        !(_context.Users.Any(y => y.AddressId == x.Id)) &&
        !(_context.Books.Any(y => y.AddressId == x.Id));

    _context.RemoveRange(addresses);

Итак, я удаляю адреса, которых Id нет в таблице «Пользователи» или «Книги».

Он работает, и я применяю его для более чем 2 таблиц, поскольку адрес используется еще в нескольких.

Вопросы

  1. Есть ли лучший способ улучшить мой запрос?

  2. Есть ли лучший подход к этому?

...