每个子类的 NHIBERNATE 表 "invalid cast"异常



每个子类的表模式面临一些奇怪的问题。我已经创建了一些对象(Bid,见下文),并使用ISession方法SaveOrUpdate(obj)将其添加到DB中。它运行良好,我的表更新正确。但是当我想通过调用方法get(type,key)来获取这个对象时,我收到了错误"InvalidCastException:System.String"。
经过一个小时的反编译,我收到了关于错误的更多信息:"无效的强制转换异常:无法将System.String强制转换为DocumentHolder"。我真的很困惑,因为在我的代码中没有看到任何从String到DocumentHolder的可能转换
您可以看到下面的代码。(我已经从课堂上删除了所有不必要的项目)

public abstract class DocumentHolder
{
    public DocumentHolder(){}
    public DocumentHolder(string Id)
    {
        this.Id = Id;
    }
    public virtual string Id { get; set; }
    //each subentity has it own Type
    public abstract string EntityType { get; }
    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        var t = obj as DocumentHolder;
        if (t == null)
            return false;
        if (Id == t.Id && EntityType == t.EntityType)
            return true;
        return false;
    }
    public override int GetHashCode()
    {
        return (Id + "|" + EntityType).GetHashCode();
    }
}
//Map implementation (simple composite id)
class DocumentHolderMap:ClassMap<DocumentHolder>
{
    public DocumentHolderMap()
    {
        this.CompositeId()
            .KeyProperty(x => x.Id, x => x.Length(50))
            .KeyProperty(x => x.EntityType, x => x.Access.ReadOnly()
                .ColumnName("entity_type"));
    }
}

我还有一个孩子impl:

public class Bid : DocumentHolder
{
  public override string EntityType
    {
        get { return "bid"; }
    }
    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        var t = obj as Bid;
        if (t == null)
            return false;
        if (Id == t.Id && EntityType == t.EntityType)
            return true;
        return false;
    }
    public override int GetHashCode()
    {
        return (Id + "|" + EntityType).GetHashCode();
    }
}
class BidMap : SubclassMap<Bid>
{
   public BidMap()
   {
       KeyColumn("id");
       KeyColumn("entity_type");
   }
}

代码中的某个位置:

//creating a Bid bid;
session.SaveOrUpdate(bid); //works fine
var newBid = session.Get(typeof(Bid),bid.Id); //throws InvalidCastException

哦,我的错误。由于我有一个带有复合键的类,我需要通过复合id获取()。而不仅仅是字符串id。工作代码:

session.Get(new Bid(Id = "balbal")); //there is the key field "EntityName" generated by default (as it readonly)

但这条异常消息并没有提供任何信息。

最新更新