У меня есть адрес объекта:
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 таблиц, поскольку адрес используется еще в нескольких.
Вопросы
-
Есть ли лучший способ улучшить мой запрос?
Есть ли лучший подход к этому?