2012-08-16 49 views
3

我在映射nhibernate中的一個屬性時遇到了一些問題。我有一個映射到集合的多對多關係。不過,我也想將一個屬性映射到多對多集合的第一個元素。這裏是我的代碼: 類我映射:獲取多對多關係的第一個元素

public class Project { 
    public Project() { 
     this.Addresses = new List<Address>(); 
    } 

    public virtual int ID { get; set; } 
    public virtual IList<Address> Addresses { get; set; } 
    public virtual Address CurrentAddress { get; set; } 
} 

的類映射:

public class ProjectMap : ClassMap<Project> { 
    public ProjectMap() { 
     Table("Project"); 
     Id(x => x.ID).GeneratedBy.Identity(); 

     HasManyToMany(x => x.Addresses) 
      .Table("ProjectAddress") 
      .ParentKeyColumn("ProjectID") 
      .ChildKeyColumn("AddressID").Cascade.All(); 
    } 

但我需要CurrentAddress指向地址屬性的第一要素。所以,我想與返回這樣的第一元素的吸氣劑,以解決這個問題:

 public virtual Address CurrentAddress { 
     get { 
      if (!Addresses.Any()) { 
       Address newAddress = new Address(); 
       this.Addresses.Add(newAddress); 
       return newAddress; 
      } 
      else { 
       return this.Addresses.First(); 
      } 
     } 
    } 

然而,當我嘗試查詢整個項目類currentaddress,我得到一個QueryException:無法解析屬性:CurrentAddress。

這很明顯是因爲CurrentAddress屬性沒有映射到Nhibernate中,但我該如何解決這個問題?

回答

1

正如您正確指出的那樣,您無法查詢非映射屬性,因爲NHibernate無法生成適當的SQL - 屬性的getter可能會非常複雜。

有沒有辦法解決這個問題,雖然你可能有一些運氣探索解決這樣的:http://fabiomaulo.blogspot.cz/2010/07/nhibernate-linq-provider-extension.html

不過,我建議查詢內存中的非映射屬性。

+0

而且沒有辦法將它映射到多對多映射的第一個元素嗎? – 2012-08-16 10:23:51

+0

我想不出一個簡單的方法來做到這一點。爲什麼不直接在查詢中使用'Addresses.First()'? – twoflower 2012-08-16 10:59:41

相關問題