EntityFramework - powiązane tabele

0

Cześć wszystkim,

Tworzę wspólnie ze znajomymi prostą aplikację webową w ASP NET CORE. Od wczoraj borykam się jednak z pewnym problemem - chodzi o sposób migracji, aktualizacji bazy i późniejszego pobierania z niej danych. Biznesowo wygląda to tak:

  1. Tabela "Kategorie" posiada ID i Name, dodałem jej model:
    public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Subcategory> Subcategories {get;set;}
    }

...Interfejs:

public interface ICategoriesRepository
    {
        Category GetCategory(int Id);
        IEnumerable<Category> GetAllCategories();
        Category AddCategory(Category category);
        Category UpdateCategory(Category categoryChanges);
        Category DeleteCategory(int Id);
    }

...oraz klasę, która wykonuje zapytania na BD:

    public class SQLCategoryRepository : ICategoriesRepository
    {
        private readonly AppDbContext context;

        public SQLCategoryRepository(AppDbContext context)
        {
            this.context = context;
        }
        
        public Category AddCategory(Category category)
        {
            context.Add(category);
            context.SaveChanges();
            return category;
        }

        public Category DeleteCategory(int Id)
        {
            Category category = context.Categories.Find(Id);
            if(category != null)
            {
                context.Categories.Remove(category);
                context.SaveChanges();
            }
            return category;
        }

        public IEnumerable<Category> GetAllCategories()
        {
            return context.Categories;
        }

        public Category GetCategory(int Id)
        {
            return context.Categories.Find(Id);
        }

        public Category UpdateCategory(Category categoryChanges)
        {
            var category = context.Categories.Attach(categoryChanges);
            category.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
            context.SaveChanges();
            return categoryChanges;
        }
  1. Posiadam także klasę AppDbContext, która dziedziczy po IdentityDbContext (tutaj w sumie moje pierwsze pytanie - czy jest to poprawne? Wg tutoriala z sieci tak, ale wydaje mi się że bardziej przejrzyste byłoby aby stworzyć np klasę UserDbContext, która dziedziczy po IdentityDbContext, a późnije stworzyć klasę AppDbContext, która dziedziczy bezpośrednio po DbContext).
    public class AppDbContext : IdentityDbContext<ApplicationUser>
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
        {

        }

        public DbSet<Category> Categories { get; set; }
        public DbSet<Subcategory> Subcategories { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
        }
    }

Do tego miejsca wszystko było ok, pobierane były kategorie, ale bez podkategorii, których jeszcze nie stworzyłem. W kolejnym kroku chciałem je zaimplementować. Wykonałem więc analogiczne kroki:

  1. Klasa modelu:
    public class Subcategory
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CategoryId { get; set; }
        public Category Category { get; set; }
    }

...Interfejs:

public interface ISubcategoriesRepository
    {
        Subcategory Get(int Id);
        IEnumerable<Subcategory> GetAll();
        Subcategory Add(Subcategory subcategory);
        Subcategory Update(Subcategory subcategoryChanges);
        Subcategory Delete(int Id);
    }

...oraz klasa do połączenia z BD:

    public class SQLSubcategoryRepository : ISubcategoriesRepository
    {
        private readonly AppDbContext context;

        public SQLSubcategoryRepository(AppDbContext context)
        {
            this.context = context;
        }

        public Subcategory Add(Subcategory subcategory)
        {
            context.Add(subcategory);
            context.SaveChanges();
            return subcategory;
        }

        public Subcategory Delete(int Id)
        {
            Subcategory subcategory = context.Subcategories.Find(Id);
            if (subcategory != null)
            {
                context.Subcategories.Remove(subcategory);
                context.SaveChanges();
            }
            return subcategory;
        }

        public IEnumerable<Subcategory> GetAll()
        {
            return context.Subcategories;
        }

        public Subcategory Get(int Id)
        {
            return context.Subcategories.Find(Id);
        }

        public Subcategory Update(Subcategory subcategoryChanges)
        {
            var subcategory = context.Subcategories.Attach(subcategoryChanges);
            subcategory.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
            context.SaveChanges();
            return subcategoryChanges;
        }
    }
  1. Na bd tabele są połączone kluczem obcym (po dodaniu modeli kategori i podkategorii zrobiłem migrację, zaktualizowałem bd)

Mój problem polega na tym, że w momecie wykonywania metody GetAllCategories() pobierają mi się tylko Id oraz Nazwy kategorii, kolekcja z "Podkategorią" jest nullem. Pytanie brzmi - dlaczego? W końcu tabele są powiązane kluczem obcym na BD, mimo to nie jest zwracana lista podkategorii. Czy brakuje mi jakiegoś powiązania w kodzie? Przeiterowania?

1

Jak chcesz mieć jest zaciągnięte jeszcze relacyjne dane to include. czyli context.categories.include(c=>c.Subcategories)

0
szydlak napisał(a):

Jak chcesz mieć jest zaciągnięte jeszcze relacyjne dane to include. czyli context.categories.include(c=>c.Subcategories)

nie mogę skorzystać z include po Categories.

Edit: ok brakowało namespeca. Niestety po wykonaniu kodu zwraca mi błąd "Invalid object name "Subcategories""
Edit2: zrobiłem migrację z updatem BD - nazwa tabeli na BD była błędna. Po aktualizacji wszystko śmiga.

Temat do zamknięcia.

2

Po co ci ta nieszczęsna, dodatkowa abstrakcja nad DbContextem?

0
var napisał(a):

Po co ci ta nieszczęsna, dodatkowa abstrakcja nad DbContextem?

O czym mówisz? O SQLSubcategoryRepository.cs?

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