0

我有一个地址实体:

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. 有更好的方法吗?

4

0 回答 0