Asp.Net Mvc i EF połączenie z bazą w modelu

0

Próbowałem szukać wątku, który dałby mi odpowiedź na moje pytanie ale niestety nie znalazłem. Fragment kody modelu:

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int OrderId { get; set; }
       
        [Required]
        [DisplayName("Order Number")]
        public int OrderNumber { get; set; } 

        [DisplayName("Order Date")]
        [DataType(DataType.Date)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
        public DateTime OrderDate { get; set; }

        (...)

        [Required]
        public int CompanyId { get; set; }

        [NotMapped]
        public string CompanyName
        {
            get
            {
                string aname = new EntityDb().Agencies.Find(AgencyId).AgencyName;
                return aname;
            }
        }      

Czy prawidłowe jest pobieranie danych w Modelu?
Przykład powyższy ma tylko na celu pobranie i wyświetlenie nazwy firmy wg jego Id podczas tworzenia zamówienia. Czy jednak lepiej aby nazwa firmy została jednak pobrana z bazy w Kontrolerze?

Dzięki.

1

Trochę dziwne podejście dla mnie, zainteresuj się czymś co nazywa się "Navigation Properties". Wtedy będziesz miał w modelu po prostu virtual CompanyModel Company z którego sobie wyciągniesz co chcesz.

4
szymon7500 napisał(a):
    [NotMapped]
    public string CompanyName
    {
        get
        {
            string aname = new EntityDb().Agencies.Find(AgencyId).AgencyName;
            return aname;
        }
    }      
Czy prawidłowe jest pobieranie danych w Modelu? 
Przykład powyższy ma tylko na celu pobranie i wyświetlenie nazwy firmy wg jego Id podczas tworzenia zamówienia. 

Jak napiszesz test jednostkowy do takiej klasy?
Dlaczego podczas tworzenia zamówień chcesz coś wyświetlać? Pisanie i czytanie to dwie skrajnie różne czynności.

Używanie jednej klasy do modelowania struktury bazy i widoku użytkownika szybko się mści. Klasa się okropnie rozrasta, dodanie nowych danych do bazy powoduje magiczne zepsucie GUI, chęć wyświetlenia czegoś w GUI powoduje konieczność cudowania i robienia na około, jak w powyższym przykładzie. A potem pojawiają się dziwne problemy wydajnościowe, bo nagle każdy obiekt w swoich właściwościach otwiera sobie połączenia do bazy w celu dociągnięcia jakichś danych i mamy select n^2 + 1.

Czy jednak lepiej aby nazwa firmy została jednak pobrana z bazy w Kontrolerze?

Absolutnie nie! Tym powinna zająć się warstwa logiki biznesowej, nie logiki prezentacji. Kontrolery służą do przekierowania danych do odpowiedniego serwisu biznesowego oraz wyświetlania odpowiednich widoków, nie powinny zawierać żadnej innej logiki, a już na pewno nie odwoływać się do bazy danych.

0

Trochę zamieszałem ze swoim pytaniem, ale ok.

@EntityPamerano, dzięki. Znam trochę Navigation Properties w EF. W moim pytaniu zrobiłem mały błąd, gdyż nie napisałem, że między tabelą z firmami a zamówieniami jest jeszcze jedna tabela z relacjami do tych tabel i trochę te Navigation mi psuje i nie działa, stąd konstrukcja modelu jak w pytaniu.

@somekind przykład trywialny i chciałem właśnie to zrobić jak najprościej. Ale tak jak wspomniałem trochę sam się zakręciłem w pytaniu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.