我是 NHibernate 新手。刚刚开始学习NHibernate。
我的 C# 代码出现运行时错误
NHibernate.PropertyAccessException 未处理
Message=Invalid Cast (check your mapping for property type mismatches); setter of NHibernateDemo.Customer
InnerException: System.InvalidCastException
Message=Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericSet`1[NHibernateDemo.Order]' to type 'System.Collections.Generic.ISet`1[NHibernateDemo.Order]'.
以下是我编写的 C# 代码
public class Customer {
public Customer()
{
MemberSince = DateTime.UtcNow;
Orders = new HashSet<Order>();
}
public virtual Guid Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual Location Address { get; set; }
public virtual ISet<Order> Orders { get; set; }
}
它的hbm文件如下
<class name="Customer" table="Customer" lazy="true" >
<id name="Id">
<generator class="guid.comb" />
</id>
<property name="FirstName" />
<property name="LastName" />
<component name="Address" >
<property name="Street" />
<property name="City" />
<property name="State" />
<property name="Country" />
</component>
<set name="Orders" table="`Order`" order-by="Ordered desc">
<key column="CustomerId" />
<one-to-many class="Order" />
</set>
</class>
public class Order {
public virtual Guid Id { get; set; }
public virtual DateTime Ordered { get; set; }
public virtual DateTime Shipped { get; set; }
public virtual Location ShipAddress { get; set; }
public virtual Customer Customer { get; set; }
}
<class name="Order" table="`Order`">
<id name="Id">
<generator class="guid.comb" />
</id>
<property name="Ordered" />
<property name="Shipped" />
<component name="ShipAddress" >
<property name="Street" />
<property name="City" />
<property name="State" />
<property name="Country" />
</component>
<many-to-one name="Customer" column="CustomerId" />
</class>
如果我将客户 HBM 文件中的“设置”部分更改为“列表”,并在客户类中进行必要的更改。程序运行正确。另外,如果我从客户 HBM 文件中删除“设置”部分;它正在工作。
您能帮我找出客户 HBM 文件的“set”部分有什么问题吗?
最佳答案
您的映射几乎是正确的,但是 ISet
接口(interface)不是来自系统命名空间,而是来自 iesi
库(与 NHibernate 一起分发)
所以你可以引用iesi
并更改您的映射:
public virtual Iesi.Collections.Generic.ISet<Order> Orders { get; set; }
或者使用IList<>
并使用 bag
进行映射
<bag name="Orders" table="`Order`" order-by="Ordered desc">
<key column="CustomerId" />
<one-to-many class="Order" />
</bag>
注意也不要忘记初始化列表,以防万一该实体是通过 new 运算符创建的并且不是由 NHibernate 加载的
关于NHibernate.PropertyAccessException 未处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468173/