В моем проекте .NET Core у меня есть две сущности со многими отношениями:
Книга:
public class Book
{
[Key]
public int BookId { get; set; }
public string Name { get; set; }
public string AuthorName { get; set; }
public int YearOfPublishing { get; set; }
public LibraryType Type { get; set; }
public virtual ICollection<BookPublicHouse> PublicHouses { get; set; }
public Book()
{
PublicHouses = new Collection<BookPublicHouse>();
}
}
Публикация:
public class PublicHouse
{
[Key]
public int PublicHouseId { get; set; }
public string PublicHouseName { get; set; }
public string Country { get; set; }
public virtual ICollection<BookPublicHouse> Books { get; set; }
public PublicHouse()
{
Books = new Collection<BookPublicHouse>();
}
}
И я создаю соединительную таблицу:
public class BookPublicHouse
{
public virtual Book Book { get; set; }
public virtual PublicHouse PublicHouse { get; set; }
public int BookId { get; set; }
public int PublicHouseId { get; set; }
}
Вот контекстный класс:
public class LibraryContext : DbContext
{
public LibraryContext(DbContextOptions<LibraryContext> options)
: base(options)
{ }
public virtual DbSet<Book> Books { get; set; }
public virtual DbSet<PublicHouse> PublicHouses { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<BookPublicHouse>()
.HasKey(bp => new { bp.BookId, bp.PublicHouseId });
}
}
Итак, теперь мне нужно создать Api с операциями CRUD, но я не знаю, как его создать. Я не знаю, как получить книгу, включая все публичные дома, которые она содержит
[Route("api/books")]
public class BookController : Controller
{
private LibraryContext _dbContext;
public BookController(LibraryContext context)
{
_dbContext = context;
this.mapper = mapper;
}
//get()
//get(id)
//create()
//update
//delete
}





Для Entity Framework Основной обычно используется Include(), за которым следует ThenInclude. Для включения дочерних сущностей дочерних элементов.
var book = _dbContext.Books
.Include(b => b.PublicHouses)
.ThenInclude(bph => bph.PublicHouse)
.FirstOrDefault(b => b.BookId == 1);
(также имейте в виду, что intellisense заставит вас поверить в неправильный синтаксис, пока вы не напишете его полностью, а иногда вам нужно запустить успешную сборку, прежде чем она перестанет жаловаться)
Дополнительно вам необходимо удалить атрибут
virtualваших DbSets в LibraryContext.