2009-04-22 10 views
0

Ich baue ein Blog/CMS-System (zum Spaß, ich weiß, es gibt eine Tonne da draußen, die ich verwenden könnte).
Ich habe eine einfache Tag-Entität, die nur eine Id (int) und eine TagName (String) -Eigenschaft hat. Ich möchte nHibernate so konfigurieren, dass ich so etwas tun kann:Wie verhindert man das Einfügen von doppelten Daten mit nHibernate?

var tag1 = Tag.CreateTag("duplicate tag test"); // Id=0 at this point 
var tag2 = Tag.CreateTag("duplicate tag test"); // Id=0 at this point 
TagRepository.Save(tag1); // tag1.Id is non-zero 
TagRepository.Save(tag2); // tag2.Id should be the same as tag1.Id at this point, but it's not 

Assert.AreEqual(tag1, tag2); 

Ich sehe Save (Tag) so etwas wie ein Look-up zu tun, und wenn der Tag bereits vorhanden ist, irgendwie tag2 mit tag1 Werte ersetzen. nHibernate arbeitet mit einer Magie, die die Eigenschaften des Parameters ändert, obwohl er nicht als out-Parameter übergeben wird. Kann mir jemand sagen, was hier los ist und wie ich diese Methode reparieren kann, um das zu tun, was ich will? Ich versuche zu vermeiden, das out-Schlüsselwort für den Tag-Parameter zu verwenden.

+0

Dieser Code fügt Duplikate ein? Könntest du ein bisschen mehr erklären? –

+0

Nein, dieser Code nicht. Wenn ich den Aufruf GetByTagName/check entferne, tut es. Ich suche, wie nHibernate das Id-Feld des Tag-Objekts ändert, das an die Methode übergeben wird. Es ist kein out-Parameter, aber nachdem die Methode Save zurückgegeben wurde, wird die Variable tag.Id von 0 auf ungleich Null geändert, wenn ein neues Tag erstellt wird. Ich möchte, dass das Gleiche passiert, wenn das Tag bereits existiert (d. H. Einen FindOrInsert-Methodestyp implementieren). –

Antwort

1

Ich glaube nicht, dass Ihre Bezugnahme auf 'out Parameter' sinnvoll ist. Das Objekt ist immer noch dieselbe Instanz, aber NH hat die ID beim Speichern auf die generierte ID aktualisiert.

Ich denke, Sie müssen nur das Tag zuerst holen, wie Sie in Ihrem Beispiel tun. Wenn Sie die Anrufer wollen tut die korrekte ID sehen

tag.id = existingTag.id; 

Ich glaube, Ihre Frage auf Parameter bezieht und wie sie behandelt und nicht an NHibernate. Lesen Sie this article, um eine gute Grundlage dafür zu bekommen, wie das funktioniert.

Verwandte Themen