2016-10-11 13 views
2

Ich habe ein Szenario, in dem ich Hilfe brauche.Aktualisieren von relationalen Entitäten

Nehmen wir an, dass es einen Benutzer gibt, der irgendeine Art von Musik hört.

class User 
{ 
    public virtual List<UserMusicType> Music { get; set; } 
} 

public class UserMusicType 
{ 
    public int ID { get; set; } 
    public MusicType name { get; set; } 
} 

public class MusicType 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

Es ist eine Form, wo ich Benutzer bin gefragt zu überprüfen/wählen alle Arten von Musik er hört. Er wählt drei Arten, nämlich {Pop, Rock und Elektronik}

CASE 1:

Jetzt möchte ich die Benutzereinheit aktualisieren und diese drei neuen Typen ein. Nach meinem Verständnis muss ich zunächst alle MusicTypes für diese Benutzer in der Datenbank speichern und dann diese neuen Typen erneut einfügen. Ist es ein richtiger Ansatz? Alle vorherigen entfernen und neue einfügen? Oder eine andere Möglichkeit, es zu tun?

CASE 2:

I MusicType Namen als String natürlich nehme. Jetzt, während der Benutzer Entity zu aktualisieren, muss ich zuerst die MusicType.ID danach hole ich der Lage sein, dies zu tun:

user.Music.Add(new UserMusicType() { ID = SOME_ID }); 

Gibt es einen besseren Ansatz für diesen Fall?

Ich werde froh sein, einige Antworten von erfahrenen Leuten in EF zu haben. Ich möchte lernen, ob es einen effizienten Weg gibt, dies zu tun. Oder auch wenn meine Annäherung/Models total falsch sind oder verbessert werden könnten.

Antwort

1

Erste Frage:

Eigentlich ist es eine persönliche Präferenz. Weil, würde nicht alle Zeilen löschen wollen, die zu diesem Benutzer gehören und sie dann einfügen. Ich würde die Sammlung, die aus dem Formular gebucht wird, mit den Zeilen vergleichen, die in der Datenbank gespeichert sind. Löschen Sie dann die Objekte aus der Datenbank, die nicht mehr in der Sammlung vorhanden sind. Und füge neue ein. Sogar können Sie diese Entitäten aktualisieren, die einige zusätzliche Details geändert haben.

Übrigens können Sie dies einfach mit dem kürzlich veröffentlichten EntityGraphOperations für Entity Framework Code First erreichen. Ich bin der Autor dieses Produktes. Und ich habe es in den github, code-project und nuget veröffentlicht. Mit Hilfe der Methode InsertOrUpdateGraph werden Ihre Entitäten automatisch als oder Modified festgelegt. Und mit Hilfe der Methode DeleteMissingEntities können Sie die Entitäten löschen, die in der Datenbank, aber nicht in der aktuellen Sammlung vorhanden sind.

// This will set the state of the main entity and all of it's navigational 
// properties as `Added` or `Modified`. 
context.InsertOrUpdateGraph(user) 
     .After(entity => 
     { 
      // And this will delete missing UserMusicType objects. 
      entity.HasCollection(p => p.Music) 
       .DeleteMissingEntities(); 
     }); 

können Sie my article on Code-project mit einem Schritt-für-Schritt-Demonstration lesen und ein Beispielprojekt ist zum Download bereit.

Zweite Frage:

Ich weiß nicht, auf welcher Plattform Sie Ihre Anwendung entwickeln. Aber im Allgemeinen speichere ich solche Bibliotheken wie MusicType in einem Cache. Und verwenden Sie DropDownList Element für das Rendern aller Arten. Wenn der Benutzer das Formular sendet, erhalte ich Werte und nicht die Namen der ausgewählten Typen. Also, keine zusätzliche Arbeit ist erforderlich.

+0

Wenn i MusicType.ID in Ankreuzfelder, kann jeder Benutzer es ändern und einige zufällige ID-Typ, die nie existieren können. Wird EF nur diejenigen hinzufügen, die existieren? Oder fügt es eine neue ID hinzu? Muss ich mich wegen der Ausnahme Sorgen machen? – Waleed

+0

@Waleed Es werden neue eingefügt, wenn Sie den Status auf "Added" geändert haben. Aber der bessere Weg ist es, zu überprüfen, ob die IDs des untergeordneten Typs bereits in der Sammlung "MusicType" vorhanden sind, die im Cache gespeichert ist. Also keine zusätzliche Abfrage an die Datenbank. –

1

Zu allererst Sie brauchen nicht die UserMusicType Klasse, können Sie einfach die `User-Klasse deklarieren

class User 
{ 
    public virtual List<MusicType> Music { get; set; } 
} 

Und Entity Framework wird eine viele zu viele Beziehung Tabelle in der Datenbank erstellen

Wie für die erste Frage, es kommt darauf an. Wenn Sie diese Beziehung woanders verwenden, wie Zahlung oder Audit-Trail, dann wäre der beste Weg, die gebuchten Werte mit den gespeicherten Werten zu vergleichen, zB:

Benutzer ausgewählt Musik 1, Musik 2, Musik 3 für die erste Zeit und gespeichert, in diesem Fall werden die 3 Datensätze eingefügt. Der Benutzer hat seine Auswahl bearbeitet und Musik 1, Musik 3, Musik 4 gewählt, in diesem Fall erhalten Sie die Werte, die 1,3,4 und erhalten die Werte in der Datenbank gespeichert, die 1,2,3 Dann Sie ist wird die neuen Werte erhalten, die in den neuen Werten vorhanden sind, aber nicht im alten, in diesem Fall ist es 4

Sie erhalten die entfernten Werte, die in der alten, aber nicht in der neuen existieren, In diesem Fall ist es Musik 2. Der Rest kann ignoriert werden.

Also, Ihre Anfrage, Musik 4 hinzufügen wird, entfernen Sie Musik 2.

Wenn Sie nicht auf die Beziehung abhängen, dann ist es einfacher, einfach alle Musik Anwender zu entfernen und die Sammlung erneut hinzufügen.

Wie für den zweiten Teil Ihrer Frage, ich nehme an, Sie werden einige Chechboxen für den Benutzer anzeigen, sollten Sie den Wert für das Kontrollkästchen Steuerelement als MusicType ID, und das ist, was auf das Backend und Sie gebucht werden kann es verwenden, um es mit dem Benutzer zu verknüpfen. ex:

user.Music.Add(new MusicType{ID=[selected ID ]} 

Sie sollten nicht auf die Musik Namen abhängen

+0

Okay, ich wusste nicht, dass EF automatisch viele-zu-viele Tabellen erstellen kann. Wenn ich MusicType.ID in den Kontrollkästchen verwende, kann jeder Benutzer es ändern und eine zufällige ID eingeben, die möglicherweise nie existiert. Wird EF nur diejenigen hinzufügen, die existieren? Oder fügt es eine neue ID hinzu? Muss ich mich wegen der Ausnahme Sorgen machen? – Waleed

+0

Nur eine Verwendung, die eine sehr gute HTML-Kenntnisse und einige Hacking-Hintergrund haben, wird dies tun und Sie können überprüfen, ob die ID in Ihrer Datenbank vorhanden ist, beachten Sie, dass die ID nicht in der Benutzeroberfläche sichtbar ist, die typische HTML dafür be ' Musik 1' –

Verwandte Themen