具有复合键的实体上的NHibernate ISession.Get()会抛出InvalidCastException

时间:2013-10-22 15:04:33

标签: c# vb.net nhibernate

NHibernate的ISession的Get()方法在使用复合键的实体上调用时会抛出InvalidCastException。

System.InvalidCastException : <>f__AnonymousType0`2[[System.Int16, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

我在NHibernate Documenatation上看不到ISession.Get()和复合键的提示。但是其他answersblog posts建议我们可以使用匿名类型作为id调用ISession.Get()。

起初我认为这个问题只适用于VB.Net,因为它使用了稍微不同的匿名类型实现。因此,我在C#中重写了测试用例,但没有取得更多成功。我的代码有问题吗?

我的测试代码:

实体:

public class Composite1
{

    // Test with composite key

    public virtual short Key1 { get; set; }
    public virtual string Key2 { get; set; }

    public virtual string Text { get; set; }

    public override bool Equals(object obj)
    {
        Composite1 o = obj as Composite1;
        if (o==null) return false;
        return o.Key1.Equals(this.Key1) && o.Key2.Equals(this.Key2);
    }

    public override int GetHashCode()
    {
        return Key1.GetHashCode() ^ Key2.GetHashCode();
    }

}

映射:

class Composite1Map : ClassMap<Composite1>
{

    public Composite1Map()
    {
        CompositeId().KeyProperty(x => x.Key1, "Key1")
                     .KeyProperty(x => x.Key2, "Key2");
        Map(x => x.Text);
    }

}

存储库中的GetByID:

public Composite1 GetByID(short Key1, string Key2)
{
    return Session.Get<Composite1>(new {Key1 = Key1, Key2 = Key2});
}

失败的测试:

Composite1 composite1 = composite1Repository.GetByID(1, "Test");

1 个答案:

答案 0 :(得分:2)

您链接到的其他答案或博文中没有使用匿名类。他们所做的是他们使用对象初始化器语法来初始化实体类本身的对象。