2009-03-10 5 views
1

iki kez bir sorgu çalıştırır: NHibernate SQL Server Express 2008 tarihinde NHibernate.Linq ve Akıcı NHibernate Ben başvurulan mülkiyet (birçok kimse haritalama) üzerinde bir yüklemi kullanarak bir varlığı seçilirken ediyorum. Fetch = join, unique = true, tembel-load = false var. Log4net günlüğünü etkinleştirdim ve bu tür bir sorguyu çalıştırdığında iki aynı SQL sorgusunu günlüğe kaydeder. Sorguyu çalıştırmak bir satır döndürür ve IQueryable.Single uzantı yöntemini kullanmaya çalıştığımda, birden fazla satırın döndüğünü bildiren istisnayı atar. Ayrıca aynı sonuç ile standart IQuery.UniqueResult yöntemini kullanarak sorguyu çalıştırmayı denedim, günlüğe kaydetme ve sorguyu iki kez çalıştırma, sonra birden çok satır olduğunu belirten bir istisna atar, ancak yönetim stüdyosundaki asıl sorguyu çalıştırır bir sonuç Günlüğe kaydetmeyi devre dışı bıraktığımda aynı hatayı alıyorum. Her durumdaNHibernate günlükleri ve ben kullanıyorum aralıksız

ISession s = GetNHibernateSession(); 

... 

var client = s.Linq<Client>().SingleOrDefault(x => x.User.ID = 17); 

or 

var client = s.Linq<Client>().Where(x => x.User.ID = 17); 

or 

var client = s.CreateQuery("from Client as c where c.User.ID = 17").UniqueResult<Client>(); 

şu şekildedir:

kurum ve eşleştirmeleri

class User 
{ 
    int ID; 
    string UserName; 
} 

class Client 
{ 
    int ID; 
    User User; 
    Person Person; 
    Address Address; 
} 

class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.UserName); 
    } 
} 

class ClientMap : ClassMap<Client> 
{ 
    public ClientMap() 
    { 
     Id(x => x.ID); 
     References(x => x.User).Unique(); 
     ... 
    } 
} 

Sonra aşağıdaki gibi bir sorgu çağırmak (uygun erişim düzenleyiciler ve üye tipi varyans ima edilir) beyan edilir iki aynı sorguyu yürütür. Tembel yükü etkinleştirdiğimde, istemci tekrar iki sorgu kullanılarak yüklenir, ancak Kişi gibi bir üyeye erişildiğinde yalnızca bir ek sorgu yürütülür.

Akıcı uygunsuz bir eşleme üretme bu muhtemelen bir sonucu mudur? Veya SQL Server Express sürümü NHibernate tarafından uygun şekilde kullanılmıyor mu?

+0

Neden eşleme ve gerçek sorgulama kodunu eklemek gerekmez. Kodunuzdaki hatayı bulmanızı kolaylaştırır. –

cevap

3

mal oldu. İlişkilendirilmiş bir eşleme olan Müşteri'den miras kalan bir sınıfım vardı. NHibernate'in iki kez sorgulamasına neden olan budur. Bunu fark ettim, çünkü Linq() kullanırken, Müşteri'nin kendisi değil, alt sınıfı döndürdü. Miras ve haritalamanın bu özel örneği benim üzerimde bir tasarım hatasıydı ve bütün sorunun köküdür!

1

NHibernate, ben oldukça yoğun kullandım SQL Express ile herhangi bir sorun bulunmamaktadır. Benzer şekilde, Fluent NHibernate'in bu basit senaryoda (ancak duyulmamış) geçersiz eşleştirmeler oluşturması olası değildir.

Karanlıkta bir atış, ancak NHibernate'in kimliğini bir tanımlayıcı ad olarak saklı tuttuğuna inanıyorum, bu nedenle sorguda Id öğesini gördüğünde, gerçek birleşik varlık yerine yalnızca yabancı anahtarın nasıl görüneceğini bilir. Belki de kimlik yerine ID isminiz atılıyor mu?

1

Sen ne olup bittiğini daha ayrıntılı bir görünüm için mükemmel NHibernate Profilcinin kullanarak deneyebilirsiniz. Bu 30 günlük deneme lisansı ile gelir ve orada Beta iken tam lisans üzerinde bir indirim Sorun ilan etmişti başka haritalama neden oldu