2011-09-21 136 views
2

我一直在关注Bruno的优秀article,以实现流畅的Nhibernate中的一对一映射。然而,我遇到了一个小麻烦,同时映射了一个不明确的错误的私有实体。这里是我的实体,映射和错误:Reveal.Member问题与Fluent和Nhibernate映射一对一映射

实体

public class Student 
{ 
    public virtual String Studentid { get; set; }  
    public virtual Address Address { get; set; }    
} 
public class Address 
{ 
    private String StudentId { get; set; } 
    private Student Student { get; set; } 

    public Address(Student student) 
    { Student = student; } 
} 

映射:

public StudentMap() 
    { 
     Id(x => x.Studentid).GeneratedBy.Assigned();   
     HasOne(x => x.Address).Cascade.All(); 
    } 

public AddressMap() 
    { 
     Id(x=> Reveal.Member<Address>("StudentId")) 
        .GeneratedBy.Foreign("Student"); 

     HasOne(x=> Reveal.Member<Address,Student>("Student"))        
       .Constrained() 
       .ForeignKey(); 

    } 

现在,当我试图运行它,它给错误为:

Could not determine type for: System.Linq.Expressions.Expression 1[[System.Func 2[[CastleTest.Domain.Address, CastleTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, for columns: NHibernate.Mapping.Column(Member)

为什么会发生此错误?

回答

2

变化

HasOne(x => Reveal.Member<Address,Student>("Student")) 

HasOne(Reveal.Member<Address,Student>("Student")) 

因为FNH认为x => Reveal.Memberx => x.Member

通话Reveal.Member<Address,Student>("Student")回报像adress => adress.Student

+0

感谢很多答案。你能告诉我两者之间有什么区别吗?虽然它运作正常......理所当然需要知道为什么它给了错误。因为我是流利的nhibernate的新手 – Joy

+0

'x => x.Student'是一个lambda表达式,它被FNH解析以获取属性名,但是如果属性不公开,你不能在lambda中访问它,显示'构造lambda。所以'x => Reveal.Member'将被解析以获得Propertyname'Member' – Firo