2011-11-22 35 views
1

我試圖做到這一點:NHibernate的JoinQueryOver與不可見的屬性會引發異常

Key key = session.QueryOver<Key>() 
       .Left.JoinQueryOver<ConfigValue>(x => x.ConfigValues) 
       .Where(c => c.Id == cfgValue.Id) 
       .SingleOrDefault(); 

但我得到這個異常:

NHibernate.QueryException was unhandled by user code 
    Message=could not resolve property: ConfigValues of: Domain.Model.Key 

我想,這是因爲Key對象被聲明以限制訪問IList並映射到不可見屬性的方式。

public class Key 
{ 
    public virtual int Id { get; protected set; } 

    public virtual IEnumerable<ConfigValue> ConfigValues { get { return _configValues; } } 
    private IList<ConfigValue> _configValues = new List<ConfigValue>(); 
    ... 

並通過代碼映射爲:

Bag<ConfigValue>("_configValues", attr => { 
    attr.Lazy(CollectionLazy.Lazy); 
    attr.Inverse(false); 
    attr.Cascade(Cascade.None); 
}, cm => cm.ManyToMany()); 

問題:我怎樣才能做到這一點使用NHibernate API?

我設法做到這一點的唯一方法是用HQL:

IList<Key> keys = session.CreateQuery(@"select K_ 
    from Key as K_ 
    left outer join K_._configValues as KO_ 
    where KO_.Id = :cfgValueId ") 
     .SetParameter("cfgValueId", cfgValue.Id) 
     .List<Key>(); 

回答

2

我不堅定與代碼映射,但沿線

Bag<ConfigValue>("ConfigValues", attr => { 
    attr.Access("field.camelcase-underscore"); 
}, cm => cm.ManyToMany()); 

或功能NHibernate的東西(如果某人有興趣)

HasMany(x => x.ConfigValues) 
    .Access.CamelCaseField(Prefix.Underscore); 
+0

謝謝!你解決了我的兩個問題。我不喜歡硬編碼屬性名稱的映射,你的答案也解決了這個問題!最終的映射最終是:'Bag(x => x.ConfigValues,attr => {attr.Access(Accessor.Field); ...'。正確的語法來自[this post](http:// stackoverflow的.com /問題/ 7824319 /如何對生成存取場駝峯下劃線與 - nhibernates映射逐) – dstj

相關問題