使用NHibernate的Child-Parent关系

时间:2016-07-06 06:37:11

标签: c# nhibernate orm

我正试图弄清楚如何使用NHibernate建立子父关系。 我有两个班Foo和Bar。 Foo有一个Bars和Bar的集合,引用了父Foo。

public class Foo
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual List<Bar> Children { get; set; }  
}

public class Bar
{
    public virtual int Id { get; set; }
    public virtual string Description { get; set; }
    public virtual Foo Parent { get; set; }
}

这些类的映射是:

  <class name="Foo" table="foos">
    <id name="Id" column="id">
      <generator class="identity"/>
    </id>
    <property name="Name" column="name" />
    <set name="Children" inverse="true" lazy="true">
      <key column="fooId"/>
      <one-to-many class="Bar"/>
    </set>
  </class>

  <class name="Bar" table="bars">
    <id name="Id" column="id">
      <generator class="identity"/>
    </id>
    <property name="Description" column="description" />
    <many-to-one name="Parent" column="fooId"/>
  </class>

这是sesion factory的创建:

if (_sessionFactory == null)
{
    var configuration = new Configuration();
    configuration.Configure();
    configuration.AddAssembly(typeof(Foo).Assembly);
    _sessionFactory = configuration.BuildSessionFactory();
}

以下是我添加新Foo的方法:

        Foo foo = new Foo { Name = "name1" };
        foo.Children = new List<Bar>();
        foo.Children.Add(new Bar { Description = "desc1" });
        foo.Children.Add(new Bar { Description = "desc2" });

        using (ISession session = NHibirnateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Save(foo);
                transaction.Commit();
            }

当调用Save(foo)方法时,我有一个异常“Invalid Cast(检查你的映射是否有属性类型不匹配); setter of Test.Foo”。 使用iinere异常:“”无法转换对象类型\“NHibernate.Collection.Generic.PersistentGenericSet 1[Test.Bar]\" к типу \"System.Collections.Generic.List 1 [Test.Bar] \”“。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

尝试将public virtual List<Bar> Children { get; set; }更改为public virtual ISet<Bar> Children { get; set; }。 ISet可以在Iesi.Collections.Generic.ISet<>中找到。

您甚至可以尝试使用IList而不是List,看看它是否有效。避免使用集合的具体类并尝试使用接口,以便Nhibernate可以注入自己的具体实现。