Laden...

EF Core: Abfrage auf eine "unbekannte" Entity

Erstellt von monsee vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.349 Views
M
monsee Themenstarter:in
30 Beiträge seit 2018
vor 5 Jahren
EF Core: Abfrage auf eine "unbekannte" Entity

Hallo zusammen,

ich bin in meinen Anfangs-Übungen in einer Webanwendung mit Razor Pages auf ein Problem gestoßen, was die Abfrage mittels EF Core angeht. Das beruht auf meinem Datenbankdesign.

Stellt Euch vor, ich möchte EDV-Geräte abbilden.
Jedes Gerät eines Typs hat die gleichen Kopfdaten. Klasse: DeviceMetaData. der PK ist int:Id.

Jedes Gerät hingegen ist eine eigene Klasse. Zum Beispiel Workstation, Server, Drucker.
Diese haben wiederum als FK DeviceMetaDataId als Spalte. Das stelle ich mittels Interface namentlich IDevice sicher.

Wenn ich mir jetzt einen Kontext aus den verschiedenen Devices holen möchte, dann ist DeviceMetaData ja stets bestimmt.

Die jeweiligen Gerätetypen kann EF ja nicht wissen. Denn ich kann von DeviceMetaData ja keinen Join (Include) auf eine "dynamische Entität machen." Ich müsste also eine Methode haben, um dynamisch eine Property namens Device zu füllen. Diese habe ich als Typ object deklariert.

Den Gerätetyp bzw. die Entität kann ich ja z. B. als Parameter mittels meiner Page übergeben:
/Edit?id=1&devicetype=Workstations

Jetzt brauche ich, wie oben geschrieben eine Methode ähnlich dieser:

public IActionResult OnGet(int id, string devicetype)
{
....
var entity = _context.FindEntity(devicetype)
var Device = entity.Where(x => x.DeviceMetaDataId == id).SingleOrDefault();
}

Ich glaube, dass ich mit var entity = _context.Model.FindEntityType(devicetype) der Lösung schon nahe bin, aber wenn das richtig ist, wie frage ich das Model jetzt ab nach der DeviceMetaDataId ab?

Könnt Ihr mir da helfen?

Besten Dank für Eure Hilfe.

monsee

16.806 Beiträge seit 2008
vor 5 Jahren

Im Prinzip ist das kein Problem von EF, sondern des relationalen Datenbankkonzepts.
Das ist so auch nicht lösbar, da ein EF oder ORM hier das relationale Modell nicht durch hellseherische Fähigkeiten erkennen kann.
Dynamische Entitäten gibt es bei diesem Konzept nicht.

Du müsstest dies programmatisch casten - oder Du setzt auf ein Hierarchie-Modell.

PS: Datenbank-Code gehört eigentlich nicht in die Page.
[Artikel] Drei-Schichten-Architektur

W
955 Beiträge seit 2010
vor 5 Jahren

Du könntest mal prüfen ob Vererbung hier der bessere Weg ist, EF unterstützt das.

M
monsee Themenstarter:in
30 Beiträge seit 2018
vor 5 Jahren

PS: Datenbank-Code gehört eigentlich nicht in die Page.

>

Hallo Abt.
Das habe ich bisher auch vermieden. Es gibt keine Datenbankabfragen in den eigentlichen cshtml-Pages. Das geschieht alles in der CodeBehind und wird dann an's Model gebunden.

Ich habe aber grade eine denke ich viel einfachere Lösung gefunden.

Ich brauche doch einfach nur eine "DeviceBinding" Tabelle in der Datenbank erstellen.
Die hat dann einfach folgende Spalten:

DeviceMetaDataId ---> Das ist die Id der Kopfdaten
DeviceTypeId ---> Das ist die Id des Typs (1=Workstation, 2=Notebook etc.)
DeviceId ---> Das ist die Id aus der jeweiligen Tabelle des Geräts.

Damit sollte ich mir helfen können.
Ich werde mal rumprobieren 🙂

Danke auf jeden Fall schon einmal für Euren Einsatz. 👍 👍

16.806 Beiträge seit 2008
vor 5 Jahren

Arbeite nicht mit IDs, sondern wenn Du schon ein Mapping hast, dann mit Enums.

M
monsee Themenstarter:in
30 Beiträge seit 2018
vor 5 Jahren

Hi nochmal,

das mit der zusätzlichen DeviceBinding-Tabelle hat hervorragend geholfen und eröffnet mir jetzt noch ein paar mehr Möglichkeiten.

Die enums habe ich schon umgesetzt 😁

Vielen Dank. 👍

monsee