2010-11-23 4 views
2

Ich habe eine Sammlung, die auf der Mapping-Ebene gefiltert wird, um das weiche Löschen mithilfe einer "isDeleted" -Spalte in der Datenbank zu ermöglichen.Im Mapping gefilterte Auffrischungskollektionen

Die Abbildung sieht wie folgt aus:

HasMany(x => x.UploadedFiles).Where("IsDeleted = 0") 

Wenn ich die isDeleted Eigenschaft für einige Elemente setzen die Sammlung nicht automatisch das Löschen reflektieren nicht aktualisieren, bis ich die Einheit neu zu laden.

Gibt es eine Möglichkeit, ein "Refiltern" zu erzwingen, ohne die Entität neu zu laden?

Antwort

2

Die Where-Klausel im Mapping dient zum Filtern während des Abrufens. Es wird nicht zur Laufzeit verwendet, weshalb Sie nicht sehen, dass UploadedFiles aus Ihrer Sammlung ausfällt, wenn Sie IsDeleted = true festlegen. Ich glaube nicht, dass es möglich ist, die Sammlung zu aktualisieren, ohne die Entität neu zu laden, die sie besitzt.

Ich würde empfehlen, Ihre Absicht in Ihrem Objektmodell auszudrücken.

private IList<File> uploadedFiles = new List<File(); 
public virtual IEnumerable<File> UploadedFiles { 
    get { 
     return uploadedFiles.Where(x => x.IsDeleted == false); 
    } 
} 

Und dann Modifizieren Sie Ihre Mapping Ihr Begleitband Feld zuzugreifen ...

HasMany(x => x.UploadedFiles) 
    .Access.CamelCaseField() 
    .Where("IsDeleted = 0") 
+0

Das 'UploadedFiles' Eigenschaft im Objektmodell virtuell get-Set NHibernate. Willst du eine andere Eigenschaft hinzufügen (zB. NonDeletedUploadedFiles, die nach der virtuellen Eigenschaft filtert? – Variant

+1

Ich nahm an, dass UploadedFiles eine Sammlung von Objekten ist. Ich schlage vor, ein explizites Hintergrundfeld zu haben und NHibernate anzuweisen, das Hintergrundfeld zuzuordnen (oben gezeigt). Ihre UploadedFiles-Eigenschaft würde dann LINQ-to-Objects verwenden, um gelöschte herauszufiltern. –