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