Entity Framework - Beziehung mit falschem Fremdschlüssel (kein Fremdschlüssel in der Datenbank)

8

Ich habe viele Tabellen mit einer TextID-Spalte, die auf die Übersetzungstabelle verweist. Die Übersetzungstabelle benötigt auch LanguageID, um übersetzten Text in der gewünschten Sprache zu erhalten. Mein Problem ist, dass ich keine LanguageID in meiner Datenbank habe, es ist im System vordefiniert und ich weiß nicht, wie ich es mit Fluent API definieren kann, d. H. Das kann mein Modell sein:

%Vor%

Und die Übersetzungstabelle:

%Vor%

Im Grunde brauche ich Navigation wie folgt:

%Vor%

Bei Verwendung von SQL würde ich es so machen:

%Vor%

Grundsätzlich möchte ich den Fremdschlüssel TextID verwenden und bekomme NUR EINE Übersetzung - LanguageID ist statisch und im Kontext vordefiniert.

Ich kann das vorhandene DB-Schema nicht ändern. Es wäre perfekt, wenn ich das LanguageID-Feld nicht in meinem Code abbilden müsste, sondern einfach innerhalb des Mappings wie ein Systemparameter. Ist es überhaupt möglich mit EF?

    
Jarek 28.01.2013, 15:52
quelle

3 Antworten

5

Wenn Ihr LanguageID statisch ist, können Sie versuchen, diesen Hack zu verwenden.

Definieren Sie Ihre Entitäten wie:

%Vor%

Und fügen Sie diese fließende Zuordnung zu OnModelCreating in Ihrer abgeleiteten DbContext :

hinzu %Vor%

Der Hack basiert auf dem für das TPH-Mapping verwendeten Konzept, aber in diesem Fall verwenden Sie nur einen einzigen Entitätstyp, um nur eine Teilmenge von Datensätzen mit vordefiniertem% ​​co_de% zu laden. Sogar FK von der Haupteinheit sollte funktionieren, weil Sie nicht Übersetzungen mit demselben LanguageId haben können - es würde bedeuten, dass sie auch das gleiche TextId haben, was nicht möglich ist, weil LanguageId und TextId Primärschlüssel bilden / p>

Ich bin mir nicht sicher, ob es in dieser Lösung ein verstecktes Problem gibt. Ich habe es nur kurz versucht und es hat funktioniert.

    
Ladislav Mrnka 28.01.2013, 19:00
quelle
2

Was ist, wenn Sie so etwas gemacht haben?

%Vor%

Die virtuelle ICollection würde eine Liste aller Ihrer Übersetzungen unabhängig von der Sprache speichern, und die Translation-Eigenschaft würde die .Where () -Funktion für Sie übernehmen.

    
Charles 28.01.2013 16:43
quelle
2

Auch wenn die Tabelle T_T riesig ist, sehe ich nicht, wie du das anders machen könntest (naja, zumindest die Notwendigkeit, alles irgendwo zu laden).

%Vor%

Sie würden Translator.PopulateTranslator(<something to access your db>) beim Start Ihrer Anwendung aufrufen, möglicherweise mit Rücksetzungen, wenn Benutzer Übersetzungen aktualisieren können.

Dann in Ihren Entitäten anstelle von

%Vor%

hättest du

%Vor%

BEARBEITEN Eine andere Möglichkeit wäre, mit resx-Dateien anstelle von db-Daten zu arbeiten, aber ich stelle mir vor, dass Sie andere Einschränkungen haben.

    
Raphaël Althaus 28.01.2013 17:08
quelle