2009-03-18 16 views
8

NHibernate kullanarak bir tabloya eşlenen bir sınıfım var. Sorun, özelliklerin yalnızca bazılarının tablodaki sütunlarla eşleştirilmesidir. Bu iyi çünkü ekran için kullandığımız tek sütunlar eşleştiriliyor, ancak sınıfımdaki özelliklerle eşlenmeyen tablodaki diğer sütunlara karşı sorgulamanın herhangi bir yolu olup olmadığını merak ediyordum. her yerde göstermek çünkü asla değildirNHibernate'te Sorgulanmamış Sütunlar

Customer 
----------- 
CustomerId 
Name 
DateCreated 

ve biz ancak DateCreated eşlenir Nesneyi

public class Customer 
{ 
    public virtual int CustomerId {get;set;} 
    public virtual string name {get;set;} 
} 

ve name ve customerId vardır: Örneğin

aşağıdaki sütun içeren bir tablo var . Belirli bir tarihte oluşturulan müşteriler için Customer tablosunu sorgulamak istiyoruz. DateCreated'u eşleştirmek için olmadan bu yapmanın herhangi bir yolu var mı? Ayrıca, ölçüt API'sini kullanarak bunu yapmak tercih edilir.

cevap

11

Ayende Rahien, yalnızca sorgu özelliklerini belirtmek için eşlemede access="noop" belirtmeyi açıklayan bir makale yayınladı. Bakınız NHibernate – query only properties. Bunu kendim denemedim.

+0

Gerçekten güzel ve kurulum için çok kolay çalışır. – Goblin

+0

özellik elemanı ile çalışmak için - orada bir hile var mı? –

+1

@DaleBurrell Ben de bunu test ettim, işe yaramadı. Belgelere göre "noop" 'özellik 'unsuru' özellik 'öğesi için geçerli değil (bkz. [referans] (http://nhforge.org/doc/nh/en/#mapping-declaration-property)). –

5

Soru dışında düz bir SQL sorgusu kullanıyor mu? Şu anda test edemiyorum. Ancak, sorgunuz, Hazırda Beklet'in bir nesneyle eşleştirebileceği bir şey döndürdüğü sürece, eşlenmemiş alanlar üzerinde sorgulayabileceğinizi düşünürdüm. HQL/Kriterler sorguları ile

ISQLQuery query = session.CreateSQLQuery(
       "select c.* " + 
       "from Customer c " + 
       "where c.CreateDate > :CreateDate"); 

query.SetDateTime("CreateDate", new DateTime(2009, 3, 14)); 
query.AddEntity(typeof(Customer)); 

IList<Customer> results = query.List<Customer>(); 
+0

(sütun adlarım biraz farklıydı) –

+0

bu sorunun dışında değil, ancak mümkün olduğunca ölçütlerini kullanabilmeyi gerçekten çok isterim. – lomaxx

5

NHibernate yalnızca eşleştirilen edilmiştir ne çalışabilirsiniz (ham SQL olmasına rağmen: Bu iş gibi görünüyor:

DÜZENLEME (üzgünüm bu zaten bir seçenek olarak göz ardı edilmiş ise) hala Andy White'ın işaret ettiği bir seçenek). Ölçüt sorgularını kullanmak istiyorsanız, sütunu eşleştirmeniz gerekir. Bununla birlikte, NHibernate herkesin erişebileceği üyeler ile sınırlı değildir. Yani, CreateDate alanını gizlemeye devam etmek istiyorsanız, özel (belki salt okunur?) Özelliğini bildirin. Alternatif olarak, mülkiyeti atlayabilir ve NHibernate'i haritalamadaki özellik elemanında access="field" ayarlayarak alan seviyesi erişimini kullanmasını isteyebilirsiniz.

Bunu, alanın haritasını çıkarmadan yapmak istediğini biliyorum, ancak bunun mümkün olduğunu düşünmüyorum (NHibernate kaynağını değiştirmeden;). Yine de, alana karşı sorgulama yapıyorsanız alanın alanınızla bir ilgisi vardır ve bu nedenle muhtemelen haritalandırılmayı hak eder. Özel veya korumalı bir üye ile bilgileri saklamak için saklayabilirsiniz.

+0

için teşekkürler Özel bir özellik kullanmayı denedim, ancak C# ve nhibernate özel bir sanal özelliğe sahip olamazsınız sanal bir özellik :( –