2012-01-30 86 views
0

我有一些困难,代表我在流利-Nhibernate内想要的结果。也许我只是在这样一个简单的概念上采取错误的方法。fluent-nhibernate HasOne关系返回NULL

People实体从第三方服务中填充。在稍后的日期,可以生成一个帐户(证书以及将用作api密钥的guid)。用户将只有一组凭据,凭据是每个用户唯一的。

在Web应用程序管理区域中,希望列出People实体的一些属性及其用户名。

最终在查询所有人物实体时,Account始终为NULL。

  • 这是HasOne的错误用法吗?

基本上我想要的是基本上在帐户上执行左外连接。

public class Account 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual string Password { get; set; } 

    public virtual People People { get; set; } 
} 

public class People 
{ 
    public virtual int UserID { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 

    public virtual Account Account { get; set; } 
    ... 
    ... 
    ... 
} 

public class AccountMap: ClassMap<Account> 
    { 
     public AccountMap() 
     { 
      Table("Account"); 
      LazyLoad(); 
      Id(x => x.Id).GeneratedBy.Assigned().Column("ID"); 
      Map(x => x.UserName).Column("UserName").Not.Nullable().Length(100); 
      Map(x => x.Password).Column("Password").Not.Nullable().Length(100); 
      References(x => x.People).Column("People_id"); 
     } 
    } 

public class PeopleMap : ClassMap<People> 
{ 
    public PeopleMap() 
    { 
     Table("People"); 
     LazyLoad(); 
     Id(x => x.UserID).GeneratedBy.Identity().Column("People_id"); 
     Map(x => x.FirstName).Column("First_Name").Length(50); 
     Map(x => x.LastName).Column("Last_Name").Length(50); 
     HasOne(x => x.Account).PropertyRef(r => r.People).Cascade.All(); 
    } 
} 

当运行我PersistenceSpecification测试表产生我所期望的:

create table Account (
     ID UNIQUEIDENTIFIER not null, 
     UserName TEXT not null, 
     Password TEXT not null, 
     People_id INT, 
     primary key (ID), 
     constraint FKBE1051AFE1BC1FAE foreign key (People_id) references People 
    ) 

我做得完全错误的吗?

回答

1

事实证明,我的映射对于我想要完成的事情是正确的,但是无状态会话已经被打开,这最终是我的问题的来源。

+0

我有这个完全相同的问题 - 我的测试与HasOne失败,但只有在运行我的StatelessSession测试后。你能解释你做了什么来纠正这个问题吗? – 2013-12-18 19:29:07

+1

@JohnS,当我打开会话时,我将工厂方法从SessionFactory.OpenStatelessSession()更改为SessionFactory.OpenSession(); – Jesse 2013-12-21 03:14:36

1

好像您需要在People和Account ClassMap实现中使用HasOne。您目前显示帐户为References人,但不是相反。