Implementace dědičnosti v ASP.NET MVC a EF   otázka

C#, ASP.NET MVC, Entity Framework, Databáze

Zdravím,

potřeboval bych poradit ohledně dědičnosti, možná trochu i návrhu, ale hlavně ohledně implementace.

Mám poměrně jednoduchý model časové osy, která sestává z objektů dědících od TimelineEvent. TimelineEvent je abstraktní třída obsahující sdílené vlastnosti. Od této třídy dědí třeba ServiceTimelineEvent, PurchaseTimelineEvent, atp.

Databázová tabulka TimelineEvents je vygenerovaná jako TPH, takže obsahuje všechny vlastnosti všech dědících tříd. V tom by problém nebyl. Databáze je OK (myslím si).

Potřeboval bych poradit, jak napsat metody akce Create, aby vytvořily konkrétní třídu a ne tu base TimelineEvent. Při GET akci už předám konkrétní třídu (třeba ServiceTimelineEvent) jako Model, aby se vykreslilo odpovídající PartialView jako formulář - to funguje. Ale když ukládám, tak POST akce skončí chybou, že nebylo možné inicializovat abstraktní třídu TimelineEvent. Potřeboval bych, aby se neinicializoval nový objekt pro model, ale aby se použil ten model, který jsem předal v metodě GET.

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(TimelineEvent timelineEvent)
{
    if (ModelState.IsValid)
    {
        timelineEvent.EventID = Guid.NewGuid();
        db.TimelineEvents.Add(timelineEvent);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(timelineEvent);
}

Už jsem i přemýšlel, že dám celou dědičnost pryč a nechám tam jednu full tabulku, ze které budu jen vybírat některé atributy podle použitého PartialView, ale nechci to řešit starým způsobem.

Moc děkuji za jakoukoliv radu. Vše se teprve učím, tak je to možná triviální záležitost. Google jsem už použil, ale když nevím jak přesně problém definovat, tak mi ani ten nepomůže.

Díky,

Tonda

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak mate napsanou metodu GET pro Create ? Jaky model jde do View ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

díky za odpověď.

K otázce č.1:

Doplnil jsem komentáře, aby to trochu dávalo smysl.

public ActionResult Create(Guid? deviceId, int? eventId)
{
    // test na parametry
    if (!deviceId.HasValue || !eventId.HasValue)
        return HttpNotFound();

    // ziskani typu udalosti casove osy
    // v evt.ModelName je napr. "ServiceTimelineEvent"
    TimelineEventType evt = db.TimelineEventTypes.Find(eventId);
    if (evt != null)
    {
        // podle nazvu modelu ziskat typ
        Type t = Type.GetType("WebApplicationVykazy.Models." + evt.ModelName);
        // ziskat instanci typu
        // sice je to pretypovano na TimelineEvent, ale jen abych mel strukturu dat pro naplneni
        var model = (TimelineEvent)System.Reflection.Assembly.GetAssembly(t).CreateInstance("WebApplicationVykazy.Models." + evt.ModelName);

        // naplnit model daty
        model.Date = DateTime.Today;
        model.EventTypeID = eventId.Value;
        model.Type = evt;
        model.DeviceID = deviceId.Value;
        model.Device = db.HwDevices.Find(deviceId);

        // potrebny ciselnik
        ViewBag.Clients = new SelectList(db.Clients, "ClientID", "ClientName");

        // zde je typ modelu spravne
        return View("Create", model);
    }
    else
    {
        return HttpNotFound();
    }
}

K otázky č.2:

Do View jdou správně modely podle typu, takže pokud volám Create s parametrem eventId=1, tak mi vrátí model ServiceTimelineEvent, podle číselníku. Tohle se právě instanciuje správně.

Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback