【问题标题】:fluent-nhibernate HasOne relationship returning NULLfluent-nhibernate HasOne 关系返回 NULL
【发布时间】:2012-01-30 17:25:16
【问题描述】:

我在 fluent-nhibernate 中表示我想要的结果时遇到了一些困难。也许我只是在这样一个简单的概念上采取了错误的方法。

人员实体由第 3 方服务填充。稍后可以生成一个帐户(凭据以及将用作 api 密钥的 guid)。用户将只有一组凭据,并且每个用户的凭据都是唯一的。

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

最终在查询所有人实体时,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
    )

我在这里做错了什么吗?

【问题讨论】:

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


    【解决方案1】:

    似乎您需要在 People 和 Account ClassMap 实现中使用HasOne。您目前将 Account 显示为 References People,但反之则不然。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我遇到了同样的问题 - 我的 HasOne 测试失败,但只有在运行我的 StatelessSession 测试之后。你能解释一下你做了什么来纠正这个问题吗?
      • @JohnS,当我打开会话时,我将工厂方法从 SessionFactory.OpenStatelessSession() 更改为 SessionFactory.OpenSession();
      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2021-10-04
      • 2014-09-02
      • 2011-03-16
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多