Relacja wiele do wielu

0

Cześć,

Zamierzam powiązać dwie klasy w relacji wiele do wielu

    public class Book
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public ICollection<Author> Authors { get; set; }
        public string PublishingHouse { get; set; }
        public int NumberOfPages { get; set; }
        public int ISBN { get; set; }
    }

    public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string SecondName { get; set; }
        public string Nationality { get; set; }
        public ICollection<Book> Books {get;set;}
    }

Niestety automatyczna migracja nie przechodzi i wywala komunikat o tym, że powinienem wykonać tą operację manualnie. Macie jakieś pomysły dlaczego tak się dzieje? Nie wiem czy problem leży w konfiguracji moich klas, czy faktycznie powinienem zrobić to manualnie.

Unable to determine the relationship represented by navigation property 'Author.Books' of type 'ICollection<Book>'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

1

Jeszcze nie dodali tego "out of the box", ale jest już to gotowe i wejdzie w przyszłości.
Many-to-many is now ready to try in the daily builds. Note that we are still finishing up a few things and fixing bugs--see the weekly status update this week for more information and a simple end-to-end example.

Więc, na ten moment musisz utworzyć tzw. join table do dwóch relacji 1-to-many, więc coś tego typu:

public class Book
{
	public int BookId { get; set; }
	public string Title { get; set; }
	public Author Author { get; set; }
	public ICollection<BookCategory> BookCategories { get; set; }
}  
public class Category
{
	public int CategoryId { get; set; }
	public string CategoryName { get; set; }
	public ICollection<BookCategory> BookCategories { get; set; }
}  
public class BookCategory
{
	public int BookId { get; set; }
	public Book Book { get; set; }
	public int CategoryId { get; set; }
	public Category Category { get; set; }
}

oraz konfiguracja może być potrzebna

modelBuilder.Entity<BookCategory>()
	.HasKey(bc => new { bc.BookId, bc.CategoryId });  

modelBuilder.Entity<BookCategory>()
	.HasOne(bc => bc.Book)
	.WithMany(b => b.BookCategories)
	.HasForeignKey(bc => bc.BookId);  

modelBuilder.Entity<BookCategory>()
	.HasOne(bc => bc.Category)
	.WithMany(c => c.BookCategories)
	.HasForeignKey(bc => bc.CategoryId);

src: Configuring Many To Many Relationships in Entity Framework Core

1

Można też oznaczyć ICollection jako NotMapped i ręcznie powiązać przez linq. Wtedy nie musisz mieć dodatkowym klas.

0

Ok, ten temat ogarnąłem. Próbuję teraz pobrać Book z kolekcją autorów:

        public Book GetBook(int id)
        {
            return _context.Books.Include(a => a.BookAuthors);
        }

Otrzymuję :

"Nie można niejawnie przekonwertować typu "Microsoft.EntityFrameworkCore.Query.IlncludableQueryable<DataAccessLogic.Entities.Book, System.Collections.Generic.ICollection<DataAccessLogic.Entities.BookAuthor>> na "DataAccessLogic.Entities.Book". Istnieje konwersja jawna (czy nie brakuje rzutu?).

Z kolei jeśli zmienię zwracany typ danych z Book na BookAuthor otrzymuję:

"Nie można niejawnie przekonwertować typu "Microsoft.EntityFrameworkCore.Query.IlncludableQueryable<DataAccessLogic.Entities.Book, System.Collections.Generic.ICollection<DataAccessLogic.Entities.BookAuthor>> na "DataAccessLogic.Entities.BookAuthor". Istnieje konwersja jawna (czy nie brakuje rzutu?).

0

Zmaterializuj to przy pomocy FirstOrDefault czy np. ToList jeżeli faktycznie chcesz mieć np. Book.

0

Próbujesz przypisać pojedynczy obiekt na ICollection

0

Polecam zaczac od podstaw. C#, .net core, visualstudio a potem dopiero https://www.entityframeworktutorial.net/efcore/entity-framework-core.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1