3

我收到以下错误消息:

NHibernate.HibernateException: NHibernate.HibernateException: Unable to resolve property: Id.

此错误是从以下代码行引发的:

User userFound = session.QueryOver<User>()
                   .Where(x => x.Id == testObjects.TestUser.Id)
                   .SingleOrDefault();

我的缩写映射如下:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Table("USER_HEADER");
        Id(x => x.Id, "USER_ID")
            .GeneratedBy.Foreign("UserLocation");

        HasOne(x => x.UserLocation)
            .PropertyRef(x => x.Id)
            .Cascade.All();
    }
}

public class LocationMap : ClassMap<Location>
{
    public LocationMap()
    {
        Table("LOC_HEADER");
        Id(x => x.Id, "LOC_ID");

        HasOne(x => x.User)
            .PropertyRef(x => x.Id);
    }
}

在添加此关系之前,我能够查询用户对象,Location因此我知道它与它有关,但我不确定到底是什么。我可以成功创建一个User绑定到 aLocation但无法查询它的对象。使用ISession.Get会产生与上述 QueryOver 语句相同的错误。

以下是我正在运行的失败的整体单元测试:

    public void Can_Create_User()
    {
        using (NHibernate.ISession session = SessionFactory.GetCurrentSession())
        {
            using (NHibernate.ITransaction tran = session.BeginTransaction())
            {
                session.Save(testObjects.TestValidationDetail);
                session.Save(testObjects.TestUser);
                tran.Commit();
            }
        }

        using (NHibernate.ISession session = SessionFactory.GetCurrentSession())
        {
            User userFound = session.QueryOver<User>().Where(x => x.Id == testObjects.TestUser.Id).SingleOrDefault();

            Assert.IsNotNull(userFound);
            Assert.AreEqual(userFound.Id, userFound.UserLocation.Id);
        }
    }
4

2 回答 2

5

原来这是我错误使用造成的PropertyRef。在我的例子中,我不需要使用它。正在生成错误,因为没有名为的属性Id,但有一个名为 的 ID Id。我通过将映射更改为:

HasOne(x => x.UserLocation)
        .PropertyRef(x => x.Id)
        .Cascade.All();

HasOne(x => x.UserLocation)
        .Cascade.All();

HasOne(x => x.User)
        .PropertyRef(x => x.Id);

HasOne(x => x.User)
于 2012-05-17T19:11:37.750 回答
2

PropertyRef映射到property-ref是一项遗留功能,它旨在允许您在未在关联的主键上完成关联时创建多对一关联。

我猜您想指定要在哪个属性上进行连接,这就是您使用 PropertyRef 的原因。如果您在 UserLocation 的 Id 的映射中使用 Nhibernates 默认约定,则不需要显式指定属性。如果您明确给出列名,那么您需要在此处执行相同的操作,但在这种情况下,您需要指定完全相同的列名。

希望有帮助..

于 2012-05-19T10:35:33.873 回答