无法解析属性:Id

时间:2012-05-17 16:20:28

标签: nhibernate fluent-nhibernate

我收到以下错误消息:

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对象,所以我知道它与它有关,但我不确定究竟是什么。我可以成功创建一个绑定到User的{​​{1}}对象但无法查询它。使用Location会产生与上述QueryOver语句相同的错误。

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

ISession.Get

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

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

我猜你要指定连接的属性,这就是你使用PropertyRef的原因..如果你在UserLocation的Id的映射中使用Nhibernates默认约定你不需要显式指定如果你明确给出了列名,那么你需要在这里做同样的事情,但是在这种情况下你需要指定完全相同的列名。

希望有所帮助..