fluent-nhibernate HasOne关系返回NULL

时间:2012-01-30 17:25:17

标签: asp.net-mvc fluent-nhibernate domain-driven-design

我在流利的nhibernate中表达我想要的结果有些困难。也许我只是在这么简单的概念上采取错误的方法。

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

在Web应用程序管理区域中,需要列出People实体的一些属性及其UserName。

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

  • 这是否是HasOne的错误用法?

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

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
    )

我在这里做错了吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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