每个子类的表模式面临一些奇怪的问题。我已经创建了一些对象(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)
但这条异常消息并没有提供任何信息。