Właściwości dziedziczonych klas są null (Razor pages/EF Core)

0

Witajcie drodzy przyjaciele.
Mam klase bazową BookModel i klasy pochodne MovieModel i EbookModel.
W bazie danych SQL mam jedną tabelkę (TPH)
Teraz chciałbym przywołać wszystkie rekordy jakie mam w bazie danych.
Generalnie muszę stworzyć stronę na której przedstawie wszystkie rekordy z bazy danych, czyli wszystkie booki, movie i ebooki. Zamiast zwykłych klas zrobiłem jedną bazową i 2 subklasy bo tak mi doradzono że będzie najprościej. W htmlcs model ma typ MovieModel bo inaczej w View niemogłem przypisać właściwości z dziedzicznych klas w loopie.

Czemu te właściwości są null? I co ważniejsze, jak mogę najprościej wyświetlić na stronce view wszystkie rekordy z bazy danych? (Zdjecie ponizej)

Klasa bazowa:

  public class BookModel
    {
        public int ID { get; set; }
        public string Type { get; set; }
        public string Tittle { get; set; }
        public string? Author { get; set; }
        public string? Genre { get; set; }
        public int? Pages { get; set; }
        public bool Lent { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true)]
        public DateTime? LoanDateTimeStart { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true)]
        public DateTime? LoanDateTimeEnd { get; set; }

        [ForeignKey(nameof(User))]
        public int? UserId { get; set; }
        public UserModel? User { get; set; }

    }

klasy pochodne :

    public class MovieModel : BookModel
    {
        [Column("Length(min)")]
        public int? Length { get; set; }
        public string? Director { get; set; }

    }

     public class EBookModel : BookModel
    { 

    }

htmlcs :

public class SearchModel : PageModel
    {
        [BindProperty(SupportsGet = true)] public string? SearchKey { get; set; } = string.Empty;

        public List<MovieModel> AllObjects { get; set; } = new List<MovieModel>(); 
        public ApiManager? apiManager { get; set; }

        public async Task OnGet()
        {

            if (string.IsNullOrEmpty(SearchKey))
            {
              // return all
                apiManager = new();
                AllObjects = await apiManager.GetAllObjects();
               

            }
            else
            {
                // var allObjects = await apiManager.ReturnAllObjects();
                // Objects = allObjects.Where(x => x.Name.Contains(SearchKey, StringComparison.CurrentCultureIgnoreCase)).ToList();
            }
        }
    }

screenshot-20220510220403.png

Baza danych :
screenshot-20220510220601.png

0

No przy podejściu encja na twarz i pchasz to brzmi jak wyzwanie. Mam wrażenie, że coś pobieranie tego TPH nie działa.
Ten ApiManager to jest coś, co ciągnie dane z bazy?

0

Dokładnie, apiManager to po prostu httpClient który pobiera dane z bazy danych poprzez controller, symuluje tym samym środowisko gdzie musial bym pobierać dane z jakiegoś zewnętrznego serwera

0

Ale jakie API? Tam nie miało być EF?

PS Wachowscy to zdaje się siostry są. :P

1

a jakby tak pokazać kod który odpytuje bazke

0

Już pokazuje:

  public class ApiManager
    {

        private static readonly HttpClient client = new HttpClient();

        private string baseURL = "https://localhost:7282/api/";

        ///////////////////////////////
        //----------- USER ----------//  
        public async Task<List<UserModel>> GetUsers()
        {
            using (HttpClient client = new())
            {
                var response = await client.GetFromJsonAsync<List<UserModel>>(baseURL + "User");
                return response;
            }

            return null;
        }
        //---------------------------------------------------------------------------------//
        public async Task<UserModel> PostUser(UserModel User)
        {
            using (HttpClient client = new())
            {
                using (var response = await client.PostAsJsonAsync<UserModel>(baseURL + "User", User))
                {
                    var strResponse = await response.Content.ReadAsStringAsync();
                    return JsonConvert.DeserializeObject<UserModel>(strResponse);
                }
            }

            return null;
        }

        ////////////////////////////////
        //----------- Books ----------//  
        public async Task<List<MovieModel>> GetAllObjects()
        {
            using (HttpClient client = new())
            {
                var response = await client.GetFromJsonAsync<List<MovieModel>>(baseURL + "Book");
                return response;
            }

            return null;
        }
    }

A tu kontroller (pokaze tylko do Book bo User nie jest potrzebne)

   [Route("api/[controller]")]
    [ApiController]
    public class BookController : ControllerBase
    {
        private readonly AppDbContext _context;
        public BookController(AppDbContext context) { _context = context; }

        [HttpGet]
        public async Task<IActionResult> GetAllObjects()  //books, ebooks, movies
        {
            var objects =  _context.Books.ToList();
                                    
            return Ok(objects);
        }

      
    }

0

@Lobos91: a jak masz skonfigurowaną tę hierarchię? Chodzi mi o modelBuilder i metody ToTable HasDiscriminator, itd.?

0
somekind napisał(a):

@Lobos91: a jak masz skonfigurowaną tę hierarchię? Chodzi mi o modelBuilder i metody ToTable HasDiscriminator, itd.?

Cała klasa AppDbContext czyli ta klasa co konfiguruje baze danych wygląda tak (pomijam data seed bo to nieistotne)

  public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }


        public DbSet<UserModel> Users { get; set; }
        public DbSet<BookModel> Books { get; set; }
        public DbSet<EBookModel> Ebooks { get; set; }
        public DbSet<MovieModel> Movies { get; set; }


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
          
            modelBuilder.Entity<BookModel>()
            .HasDiscriminator(b => b.Type)
            .HasValue<BookModel>("book")
            .HasValue<EBookModel>("ebook")
            .HasValue<MovieModel>("movie");

        }

    }

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