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:
- 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;
}
- 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:
- 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;
}
}
- 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?