1

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]]

我在 ISession.Get() 和复合键上的NHibernate 文档中看不到任何提示。然而,其他答案博客文章建议我们可以使用匿名类型作为 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");
4

1 回答 1

2

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

于 2013-10-23T17:20:36.047 回答