Laden...

EF6 - Navigation Properties - aber kein Foreign Key vorhanden

Erstellt von fichz vor einem Jahr Letzter Beitrag vor einem Jahr 640 Views
F
fichz Themenstarter:in
26 Beiträge seit 2013
vor einem Jahr
EF6 - Navigation Properties - aber kein Foreign Key vorhanden

Verwendetes Datenbanksystem: EF6 - SqlServer

Hallo zusammen,

im Netz habe ich dazu bereits gesucht aber nicht so richtig das passende gefunden.
Mein Problem ist folgendes:
Ich arbeite mit einer verhältnismäßig großen SQL-Server Datenbank welche vor Jahren von einem alten VB6 Programm übernommen wurde und leider nur PKs hinterlegt hat. Aktuell werden zum Lesen der Daten SqlDataReader und zum Schreiben normale SqlCommands verwendet. Ich kann die aktuelle Datenbankstruktur leider nicht ändern, da ich da in Gefahr laufe, dass das Programm nicht mehr korrekt funktioniert. Nun will ich das Programm trotzdem nach und nach auf EF6 (ist ein FW 4.5 Projekt) umstellen - Bedeutet: Wenn in einem Bereich eine Änderung notwendig ist - versuche ich bei Datenbankzugriffen diese auf EF anzupassen.

Mir ist bewusst, dass ich EF nicht in vollen Zügen genießen kann - aber gerade bei den Lese-/Schreibvorgängen wäre alles typsicher und leichter zu handeln.

Wie in einem anderen Projekt will ich hier auch das UnitOfWork Pattern verwenden und kann somit schön gegen Repositories arbeiten.

So nun zum Problem:
Es gibt in meinen Datenklassen keine Navigation Properties, da es auch keine Foreign Keys gibt. Habe ich nun trotzdem irgendwie eine Möglichkeit eine Navigation Property zu erstellen, ohne dass ein FK nötig ist (und auch von EF NICHT erstellt wird)? Der PK wäre in mehreren Tabellen gleich, besteht aber teilweise aus 5+ Feldern. Natürlich könnte ich nun den Eintrag aus Tabelle A lesen und mit den Keyfeldern eine erneute Abfrage in Tabelle B machen. Da es aber aktuell teilweise Abfragen mit mehreren Joins sind wäre hier der Overhead mMn. zu groß.

Ziel wäre, dass ich dann in der Datenklasse A per Include/Join dann auf Daten in Klasse B zugreifen kann und somit nur eine Abfrage an den SqlServer sende.

Ich hoffe, ich konnte mein Problem soweit schildern, dass man es versteht. Falls nicht bringt ich gerne noch Beispiele mit den aktuellen Datenklassen.

LG
fichz

16.825 Beiträge seit 2008
vor einem Jahr

Habe ich nun trotzdem irgendwie eine Möglichkeit eine Navigation Property zu erstellen, ohne dass ein FK nötig ist (und auch von EF NICHT erstellt wird)?

Nein, eine eigentliche Navigation Property basiert immer auf einer Relation und damit einem FK. Du hast keinerlei Chance, dies zu ändern.

Ziel wäre, dass ich dann in der Datenklasse A per Include/Join dann auf Daten in Klasse B zugreifen kann und somit nur eine Abfrage an den SqlServer sende.

Das ist möglich, aber nicht mit EF Automatismen. Musst das halt alles in Linq ausprogrammieren, denn ohne Navigation Properties kann Dir EF hier nichts abnehmen.
Ebenso kannst Du die keinerlei Schreib-Mechanismen, also das Erstellen von Einträgen, automatisch machen lassen; auch hier musst Du alles ausprogrammieren.

Ich kann die aktuelle Datenbankstruktur leider nicht ändern, da ich da in Gefahr laufe, dass das Programm nicht mehr korrekt funktioniert.

Das ist problemlos möglich, damit verdienen tagtäglich viele viele Entwickler:innen- und Datenbank-Profis ihre Brötchen.
Alles eine Frage der Organisation. Aber Schema-Änderungen sind Alltagsdinge beim Umgang mit Schema-behafteten Datenbanken.

In EF6 sind Migrations nicht der Hit (ist in EF Core um Welten besser), aber mit FluentMigrations kann man sowas auch sehr gut lösen.
Schon dutzende Male damit erfolgreich "große" Datenbanken migriert.

Der MSSQL Server hat aber auch integrierte Migration Mechanismen oder eben Standard SQL-Scripts, wie tagtäglich auch auf Enterprise-Ebene laufen.
Ohne Migration macht Dein Vorhaben nur bedingt sinn. Die Zeit, die Du in Workarounds der FK-Sache stecken werden wirst, kannst wahrscheinlich in eine saubere Migration stecken und hast ein besseres, nachhaltigeres Ergebnis.

F
fichz Themenstarter:in
26 Beiträge seit 2013
vor einem Jahr

Hallo Abt,

ich habs mir fast gedacht, dass es nicht so einfach funktioniert.
Dachte wenn es einen (einfachen) Mechanismus gegeben hätte, dann könnte ich es auf diesen Weg machen.

Denke, dann werde ich die Datenbankstruktur analysieren und schauen wieweit diese sich ändern lässt, damit man FK erstellen kann.

Danke für die Info!

LG
fichz