2009-03-10 24 views
0

DB kısıtlama ihlalleri ile ilgili Bence NHibernate için oldukça yaygın bir kullanım olduğunu düşünüyorum. Bir varlık yaratıyorum ve ISession.Save() öğesini kullanarak bir Transaction.Commit() kullanarak kaydetmeye çalışıyorum. Bu noktada, benzersiz/birincil anahtar kısıtlamaları gibi şeylerin ihlallerini istisna olarak görmeyi bekliyorum. Ancak, gördüğüm sadece bir GenericADOException. Bu, özgün DB hatalarını ayırt etmeme yardımcı değil, kullanıcının tekilliği korumak için kullanıcının başka bir ad seçmesini istemek gibi şeyler.NHibernate

Şu anda, kısıtlamaların ihlal edilmemesini sağlamak için öncelikle sorgulamanın çirkin geçici çözümünü uygulamıştım. Bu sadece gerçekleşmesi gereken bir yarış durumudur ve gerçekten kullanıcıların "Oops, DB komik bir şey yaptığını görmesini istemiyorum! Belki bunu tekrar denemelisiniz." mesajlar

Bunu düzeltmenin zarif bir yolu var mı?

cevap

0

NHibernate, kısıtlamaların farkında değildir (ve ilk etapta benzersiz bir kısıtlamayı zorlamak için zorlanır), bu nedenle ele alınması büyük ölçüde size bağlıdır. Değerin mevcut olmadığını kontrol etmek için bir sorgu ile doğru yolda olduğunuzu düşünüyorum, ancak bahsettiğiniz gibi, önce değeri ekleyen başka bir işlem/iş parçacığı olasılığını bırakır. Bu yöntemin çözümü özel bir kilit, ama tabii ki bu kilidin etkilerini dikkate almanız gerekiyor. NHibernate'in kilitleme yöntemlerinin nasıl çalıştığını bilmiyorum, ancak ihtiyacınız olanı sağlamazlarsa, her zaman bağlantıya erişebilir ve ham SQL kullanabilirsiniz.