我正试图弄清楚如何使用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] \”“。
我做错了什么?
答案 0 :(得分:0)
尝试将public virtual List<Bar> Children { get; set; }
更改为public virtual ISet<Bar> Children { get; set; }
。 ISet可以在Iesi.Collections.Generic.ISet<>
中找到。
您甚至可以尝试使用IList
而不是List
,看看它是否有效。避免使用集合的具体类并尝试使用接口,以便Nhibernate可以注入自己的具体实现。