2012-08-16 56 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