Entity Framework - Beziehung mit gefälschten Foreign Key (keine Fremdschlüssel in der db)
Ich habe viele Tabellen, in denen TextID Spalte bezieht sich auf die translation-Tabelle. Die übersetzungstabelle muss auch LanguageID man übersetzt text in die gewünschte Sprache. Mein problem ist, dass ich nicht LanguageID in meiner Datenbank, es ist im system vordefiniert und ich weiß nicht, wie kann ich es definieren mithilfe der Fluent-API, ich.e das kann mein Modell:
public partial class MyEntity
{
public short ID { get; set; }
public Nullable<int> TextID { get; set; }
[NotMapped]
public Nullable<int> LanguageID { get; set; }
public virtual TEXT_TRANSLATION Translation { get; set; }
}
Und die translation-Tabelle:
public partial class TEXT_TRANSLATION
{
[Key, Column(Order = 0)]
public int TextID { get; set; }
[Key, Column(Order = 1)]
public int LanguageID { get; set; }
public string TranslatedText { get; set; }
}
Im Prinzip brauche ich eine navigation wie hier:
myEntity.Translation.TranslatedText
Während mit SQL würde ich es so machen:
Left Join TEXT_TRANSLATION ON
MyEntity.TextID = TEXT_TRANSLATION.TextID
AND TEXT_TRANSLATION.LanguageID = 1033
Grundsätzlich möchte ich nutzen, TextID foreign key bekommen und NUR EINE übersetzung - LanguageID ist statisch und vordefiniert im Kontext.
Kann ich nicht ändern vorhandene DB-schema. Ideal wäre es, wenn ich nicht brauchen, um anzeigen LanguageID Feld in meinem code, nur verwenden es im mapping wie ein system-parameter. Ist es überhaupt möglich, mit EF?
- Aber Sie haben bereits eine Spalte LanguageID in TEXT_TRANSLATION Tisch, nicht wahr ?
- ja, aber ich habe nicht LanguageId in der anderen Tabelle. Und ich brauche diese navigation
- Und können Benutzer änderungen an TEXT_TRANSLATION Tabelle ? Es ist eine riesige Tabelle ? Verursachen Sie möglicherweise alle Ihre Inhalte, steckte es in eine statische Liste, und mit ihm zu arbeiten, vielleicht ?
- T_T Tabelle ist riesig
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr
LanguageID
ist statisch, Sie können versuchen, nutzen diesen hack.Definieren Sie Ihre Einheiten wie:
Und fügen Sie diese fließend Zuordnung zu
OnModelCreating
in der abgeleitetenDbContext
:Der hack basiert auf dem Konzept für TPH-mapping, aber in diesem Fall sind Sie nur mit single entity-Typ zum laden nur Teil der Datensätze mit vordefinierten
LanguageId
. Auch FK vom main, sollte ein Unternehmen arbeiten, weil Sie nicht haben, um die übersetzungen mit der gleichenTextId
- es würde bedeuten, dass Sie auch den gleichenLanguageId
ist nicht möglich, daTextId
undLanguageId
form primary key.Ich bin mir nicht sicher, ob es irgendein verstecktes Problem in dieser Lösung. Ich gab ihm einen schnellen versuchen und es funktionierte.
DbCompiledModel
.Was ist, wenn Sie so etwas Tat:
Virtual ICollection würde speichern Sie eine Liste der alle Ihre übersetzungen, unabhängig von der Sprache, und die Übersetzung Eigentum tun würde die .Wo (), die Sie für
Selbst wenn T_T Tabelle ist riesig, ich sehe nicht, wie Sie tun konnte, einen anderen Weg (naja, zumindest die Notwendigkeit zu "laden alle irgendwo").
rufen Sie
Translator.PopulateTranslator(<something to access your db>)
auf der Startseite der Applikation mit vielleicht resettings, wenn Benutzer aktualisieren übersetzungen.Dann in Ihre Entitäten, anstatt
hätten Sie
BEARBEITEN
Ein anderer Weg wäre die Arbeit mit resx-Dateien anstelle von db-Daten, aber ich glaube, Sie haben andere Einschränkungen.