2

我是NHibernate的新手。刚开始学习NHibernate。NHibernate.PropertyAccessException未处理

我收到了运行时错误与我的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]'. 

以下为

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; } 
} 

写我的C#代码这是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文件的“设置”部分有什么问题吗?

回答

2

你的映射几乎是正确的,但ISet接口不是从系统命名空间,但来自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> 

注:也别忘记给init 列表,以防该实体是通过新的运营商创建和NHibernate的

+0

感谢Iesi.Collections.Generic.ISet 为我工作与未装载“设置“ – user1833852