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);
    }
}

この関係を追加する前にUserオブジェクトをクエリできたLocationので、それと関係があることはわかっていますが、正確にはわかりません。Userに関連付けられているオブジェクトを正常に作成できLocationますが、クエリはできません。を使用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はレガシー機能であり、関連付けが関連付けの主キーで行われていない場合に、多対1の関連付けを作成できるようにすることを目的としています。

結合を行うプロパティを指定したいと思います。そのため、PropertyRefを使用しました。UserLocationのIDのマッピングでNhibernatesのデフォルトの規則を使用している場合は、プロパティを明示的に指定する必要はありません。列名を明示的に指定している場合は、ここでも同じことを行う必要がありますが、その場合は、まったく同じ列名を指定する必要があります。

お役に立てば幸いです。

于 2012-05-19T10:35:33.873 に答える