NHibernate.PropertyAccessException 未处理

标签 nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我是 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/

相关文章:

c# - 将一个实体映射到多个表

c# - NHibernate 重新创建每个关联项

c# - nhibernate fluent bool 到 smallint 映射

c# - NHibernate - 删除时将外键列设置为空

nhibernate - 使用 NHibernate 查询字符串集合

c# - NHibernate 多事件监听器

c# - 无法解析 KeyColumn 上的属性

c# - Nhibernate - 与 Cascade all-delete-orphan 一对一映射,不删除孤儿

linq - Nhibernate 和 linq 问题

fluent-nhibernate - FluentNHibernate : how to Join to table without using primary key