ASP.NET Entity Framework 6 HashSet oder Liste für eine Sammlung?

9

Meine EF-Modelle sehen so aus:

%Vor%

Ich habe jedoch auch Implementierungen gesehen, die so aussehen:

%Vor%

Hier ist die DDL für dieses Objekt:

%Vor%

Kann mir jemand sagen, was ich benutzen soll oder gibt es sogar einen Unterschied und wann würde ich die Liste benutzen und wann das HashSet wenn das zutrifft.

Danke

    
Alan2 23.02.2015, 10:54
quelle

2 Antworten

5

Es hängt von Ihrem Anwendungsfall ab, aber in den meisten Fällen können Sie ein Objekt nur einmal zur Sammlung hinzufügen, weil beispielsweise jeder Status nur einmal auf einen Inhalt angewendet wird. Ich bezweifle, dass ein Inhalt zweimal in einem Status erscheinen kann. Daher ist HashSet die korrekte Datenstruktur, da es Duplikate verhindert. Für den Fall, dass ein Artikel dupliziert werden kann, wäre List korrekt, aber ich bin in der Praxis nicht darauf gestoßen und weiß nicht einmal, wie EF damit umgehen würde.

Als Nebenbemerkung würde ich empfehlen, dass Sie keine Sammlung von Artikeln in Ihre Entitäten aufnehmen, außer Sie brauchen sie. Wenn Sie beispielsweise eine Web-App erstellen, um Produkte aufzulisten, haben Sie wahrscheinlich eine Ansicht, in der Sie ein einzelnes Produkt zusammen mit seinen Tags anzeigen. Daher sollte Product eine Sammlung von Tags haben, um diesen Fall einfach zu machen. Allerdings haben Sie wahrscheinlich keine Seite, auf der ein Tag mit seiner Produktgruppe angezeigt wird. Daher sollte das Tag keine Produkteigenschaft haben. Es interessiert sich einfach nicht für verwandte Produkte. Es scheint, dass diese Statuseinheit sich nicht um die Sammlung von Inhalten kümmert.

    
Stilgar 23.02.2015 11:00
quelle
0

Also ein HashSet<T> ist Definition

Und ein List<T> hat diese Fähigkeiten nicht.

Also ich denke, es ist auf die gewünschten Eigenschaften und Leistung (die auf kleinen Sets ist vernachlässigbar). Sie können beide aufgezählt werden.

Leistung (obwohl wahrscheinlich winzige Unterschiede) wird in zwei Teilen, lesen und schreiben. Wie Sean bemerkte, wird es wegen Hash-Code-Berechnungen und Eindeutigkeitsvergleiche wahrscheinlich Strafen für Schreibvorgänge geben. Aber Lesevorgänge sind extrem schnell ( o(1) ).

Es liegt also wirklich an den gewünschten Eigenschaften.

In meinen Projekten würde ich List<T> verwenden, aber das ist meine Art von Konvention. Sie können Ihre eigene Konvention festlegen, solange Sie sich daran halten.

    
Callum Linington 23.02.2015 10:57
quelle