2016-07-06 79 views
1

我想弄清楚如何使用NHibernate做孩子 - 父母关系。 我有两个班级Foo和Bar。 Foo拥有一系列酒吧和酒吧,可参考家长Foo。使用NHibernate的孩子 - 父母关系

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工厂创建:

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

这里是我如何增加新富:

 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)方法时,我有一个异常“无效投射(检查您的映射属性类型不匹配); “Test.Foo的设置者” 使用iinere异常:“”无法强制转换对象类型“”NHibernate.Collection.Generic.PersistentGenericSet 1[Test.Bar]\" к типу \"System.Collections.Generic.List 1 [Test.Bar] \“”。

我在做什么错了?

+1

使用'ICollection'而不是'List' –

+0

或使用可以将''改为'' IList'而不是'List'。 –

+1

最后但并非最不重要的是:为了坚持也来自'Children'集合的项目,应该做一些更多的调整:在,并明确地为”Children“项设置一个父项:'foo.Children.Add(new Bar {Description =”desc1“,Parent = foo});'。 –

回答

0

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

你甚至可以尝试使用IList代替List,看看它是否works.Avoid使用混凝土类集合并尝试使用接口,以便NHibernate的可以注入自己的具体实现。