2012-05-10 21 views
5

A, MVC uygulamasında id numaralı bir eyleme sahip ve bir kişinin adını döndüren bir eylem var.NHibernate - Yalnızca en iyi Uygulama seçen

Bunun için en iyi uygulama nedir? NHProf ipuçlarını takip ediyorum ama kod biraz garip ya da benim için bir şey geliyor.

using (var session = Helper.SessionFactory.OpenStatelessSession()) 
{ 
    using (var tran = session.BeginTransaction(IsolationLevel.ReadCommitted)) 
    { 
     return session.Query<Person>().Where(x => x.Id == id).Select(x => x.Name).SingleOrDefault(); 
     tran.Rollback(); 
    } 
} 
+0

anlayamıyorum ... –

+0

ne bilmek istiyorsun bu sorunu yaklaşım? –

+1

“OpenStatelessSession” ı kullanmazdım, vatansız oturum toplu senaryolar içindir ve L1 önbelleğini yok sayar. Bir linq sorgusu yapmak yerine, '.Load (1)' veya '.Get (1)' dır. – Andreas

cevap

4

NHProf uyarı sayfası oldukça iyi açıklıyor bence -

http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions

Temel olarak, siz işlem kendiniz yönetmek yoksa, veritabanı, bir "örtülü bir hareketi" ve auto yaratacak söylüyor sorguları da dahil olmak üzere her bildirimi için bildirimi. Yanlış anlama, işlemlerin yalnızca ekleme/güncelleme işlemleri için yararlı olmasıdır.

Yukarıdaki örneğinizde, işleminiz yalnızca tek bir bildirimi yürütürken, bu bir sorun değildir. Yönteminiz birkaç deyim kullanıyorsa, ancak bunları bir işlemde sarmak iyi bir uygulama olacaktır.

+0

Tamam, ancak basit yöntemler için NHProf'u takip etmeli ve bir işlem oluşturmalı mıyım? – Zote

+1

Yanıt yalnızca kısmi doğrudur, veritabanı işleminizi bir işlemde işlemek için __always__ çözmeniz gerekir ve aslında tek bir deyimi çalıştırsanız bile bir sorun olur. Kapalı işlemler pahalıdır! ve NH, L2 önbelleğini bir işlem olmadan kullanmaz. Her şeyi yakalamak, gereksiz iş yapmak (yakalamak ve yakalamak) için – Andreas

-1

Ben yaklaşım nasıl aşağıdaki bu seçme:

using (var session = Helper.SessionFactory.OpenStatelessSession()) 
    using (var tran = session.BeginTransaction(IsolationLevel.ReadCommitted)) 
    { 
     try 
     { 
      string personName = session.Query<Person>() 
      .Where(x => x.Id == id) 
      .Single(x => x.Name); 

      tran.Commit(); 
      return personName; 
     } 
     catch(Exception ex) 
     { 
      // handle exception 
      tran.Rollback(); 
     } 
    } 

Bu SO cevap işlemle ilgili iyi tavsiye veren taahhüt: En LINQ ile ilgili olarak

NHibernate - Is ITransaction.Commit really necessary?

bu bir olduğunu uzantı yöntemi stili sözdizimini kullanarak sorgulamaya yaklaşmayla ilgili ilginç makale:

http://compiledexperience.com/blog/posts/how-not-to-use-linq

+0

-1. – Andreas

+0

@Andreas, kullandığımı bildiğim kadarıyla, atılmış bir istisnayı işlemenin hiçbir yolu yoktur ve seçim, gereksiz bir denemeyi veya elden çıkarma işlemini kullanmaktır. Ayrıca, bu durumda hata işlemeyi nasıl uygularsınız, çünkü bir hata atabilecek bir dizi katman vardır (NHibernate, ADO.NET, LINQ). –

+2

http://stackoverflow.com/questions/6418992/is-it-a-better-practice-to-explicitly-call-transaction-rollback-or-let-an-except ve istisnalar için http://stackoverflow.com/questions/426346/-bu-a-bad-practice-to-catch-a-non-özel-istisna-gibi-system-exceptio http://stackoverflow.com/questions/114658/catching-base- istisna sınıfında net http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx ve yığın bellekte düzgün bir şekilde işlem yapabildiğinizi söyleme tran.Rollback(); 'ile exc. – Andreas

0

tek bir HTTP isteği üzerinden birden çok oturum oluşturmaz, ideal olarak yapmanız gereken bir oturum açmak ve istek kapsamındaki ilgili işlemi açmak ve bu işlemi tüm eylemleriniz boyunca kullanmaktır. http://hackingon.net/post/NHibernate-Session-Per-Request-with-ASPNET-MVC.aspx

Ben IOC konteyner kullanımını önermek ve istek kapsamına siz ve kapsamı için bu sınıf oturumu oluşturan bir sınıf oluşturmak olacaktır:

İşte bunu başarmak için nasıl açıklayan bir blog gönderisi olduğunu. birçok kaynak web üzerinde bulunmaktadır

.. bir işlemi önermek neden Google, ..

+0

Her istek başına bir oturum tavsiye olsa da, bu zor ve hızlı bir kural değildir ve istek başına bir işleme sahip olmak kötü bir öneridir, basit ve basittir. – Spivonious