2

Ich benutze Entity Framework CTP5.Entity Framework, wenn viele zu viele Daten hält

Ich habe ein Schema wie folgt aus:

  • Eine Gruppe viele textdescriptions enthält.
  • Eine Textbeschreibung hat viele Texte.
  • Eine Sprache hat viele Texte.

So gibt es 4 Tabellen. Gruppen one-to-many Beschreibungen many-to-many Texte many-to-one Sprachen.

my model

So habe ich eine many-to-many-Beziehung, in der die Beziehung auch Daten enthält.

Definitionen von Text und Textbeschreibung (da wir auf der Id für die Gruppe abfragen können und Sprachen I havent sie hier aufgenommen)

public class Text 
{ 
    public int TextID { get; set; } 
    public int TextDescriptionID { get; set; } 
    public int LanguageID { get; set; } 
    public string OriginalText { get; set; } 
    public bool IsValid { get; set; } 
    public DateTime Added { get; set; } 
    public DateTime Updated { get; set; } 
    public Language Language { get; set; } 
    public TextDescription TextDescription { get; set; } 

    public static Text GetMissingText(string input) 
    { 
     Text text = new Text(); 
     text.OriginalText = "Missing: " + input; 
     text.IsValid = true; 
     text.TextDescription = new TextDescription() 
           { 
            IsStatic = true, 
            Name = input, 
            IsMultiline = false, 
           }; 

     return text; 
    } 
} 

public class TextDescription 
{ 
    public int TextDescriptionId { get; set; } 
    public int TextDescriptionGroupId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public bool UseHtml { get; set; } 
    public bool IsMultiline { get; set; } 
    public bool IsStatic { get; set; } 

    public TextDescriptionGroup TextDescriptionGroup { get; set; } 
    public virtual ICollection<Text> Texts { get; set; } 

    public static TextDescription GetNewItem(int textDescriptionGroupId) 
    { 
     var item = new TextDescription(); 
     item.Name = item.Description = "n/a"; 
     item.UseHtml = item.IsMultiline = item.IsMultiline = false; 
     item.TextDescriptionGroupId = textDescriptionGroupId; 
     return item; 
    } 
} 

Wenn entweder eine neue Sprache oder einen neuen Text Hinzufügen eingefügt wird ... die Viele zu viele Relationen werden nicht in die Datenbank eingefügt. (Denken Sie, es wäre eine schlechte Idee, also am Ende, wenn das die einzige Lösung ist, könnte ich dazu in der Lage sein)

Also wie handhabe ich dies auf eine kluge Weise, wenn ich alle Text holen muss für eine bestimmte Gruppe aus der Datenbank, aber auch die Übersetzung, wenn es für diese Sprachen gibt.

Ich kann das Übersetzungsobjekt nicht starten, da es nicht möglich ist. Wenn ich von der Text-Entität abfrage ... wie wähle ich nur eine Sprache aus, ohne zuerst alle Sprachen zu bekommen.

repo.Find(x => 
      x.GroupId == groupId && 
      x.Translation.Any(a => a.LanguageID == id.Value) 
); 

ich hier bin verloren ... jeder es eine intelligente Art und Weise ... so würde nicht ich die Datenbank für alle Texte ... und dann eine Abfrage für jedes Element abfragen müssen, um zu sehen ... wenn es eine Übersetzung gibt? oder mach einfach einen neuen leeren.

In SQL würde ich es tun, wie folgt:

SELECT TD.Name, T.OriginalText FROM TextDescriptions TD 
LEFT JOIN Texts T ON TD.TextDescriptionId = T.TextDescriptionId 
WHERE TextDescriptionGroupId = 41 AND ISNULL(T.LanguageId, 1) = 1 

Die obige SQL gibt mir die Elemente, auch wenn es jetzt nicht mehr aufnehmen wird, erhalte ich eine NULL für diese Werte. Ich könnte dann damit umgehen, dass es mein Code und Lazy Load vermeiden.

Aber kann ich das gleiche Verhalten in Entity Framework erhalten. Ich könnte sehen, dass es vielleicht Probleme geben könnte, wenn EF4 das Mapping machen würde ... da ich von TextDesciptions zu Texten gehe ... und TextDesciptions eine Liste von Texten haben ... aber hier ... möchte ich nur entweder 1 oder NULL oder nur eine neue Entität, die noch nicht zur Datenbank hinzugefügt wurde.

Ich freue mich auf einige interessante Antworten.

mvh

+0

Sie müssen den Code zeigen, dass nicht wie erwartet funktioniert (dh * Wenn entweder eine neue Sprache oder ein neuer Text hinzufügen eingefügt wird ... die viele zu viel Beziehung nicht in die Datenbank eingefügt. *) . Außerdem müssen wir Ihr vollständiges Objektmodell sowie eine eventuell vorhandene flüssige API sehen. Vielen Dank. –

+0

Das Problem ist, dass es so funktioniert, wie es sollte und wie ich es erwarten würde, dass es funktioniert. Ich bin auf der Suche nach einer Möglichkeit, einen Linksbündnis zu machen. Ich kann es in SQL zeigen, aber nicht sicher, wie ich es mit linq machen würde, andererseits würde es viel faule Last erzeugen. – Syska

+0

Ich benutze EF4 ... Ich bin mir nicht sicher, was Sie sehen wollen. Ich hoffe, das gepostete Bild gibt Ihnen eine Idee. Vielleicht kann ich mein Modell in VS erstellen. Nicht sicher, ob das hilft. Aber fragen Sie, ob mehr Informationen benötigt werden. Vielleicht eine bessere Designidee für die Tischstruktur. – Syska

Antwort

1

Vorerst ... wenn keine andere Lösung gefunden wird, werde ich die folgen SQL-Skript ausgeführt werden leere Datensätze einzufügen.Auf diese Weise bin ich mir sicher, dass der Datensatz vorhanden ist, wenn ein Benutzer es bearbeiten möchte und es nicht vor dem Speichern sicherstellen muss. Vielleicht auch einige naste Linq Abfrage zu vermeiden.

Ich muss nur diese SQL 2 Orte ausführen. Wenn Sie eine neue Sprache hinzufügen oder eine neue Textbeschreibung hinzufügen.

INSERT INTO Texts 
SELECT TD.TextDescriptionId, L.LanguageId, '', 0, GETDATE(), GETDATE(), L.TwoLetterISOLanguageName 
FROM TextDescriptions TD 
INNER JOIN Languages L ON 1 = 1 
LEFT JOIN Texts T ON 
T.TextDescriptionId = TD.TextDescriptionId AND 
T.LanguageId = L.LanguageId 
WHERE TextId IS NULL 
Verwandte Themen