使用NHibernate的孩子 - 父母关系
问题描述:
我想弄清楚如何使用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] \“”。
我在做什么错了?
答
尝试更改public virtual List<Bar> Children { get; set; }
至public virtual ISet<Bar> Children { get; set; }
。 ISet可以在Iesi.Collections.Generic.ISet<>
中找到。
你甚至可以尝试使用IList
代替List
,看看它是否works.Avoid使用混凝土类集合并尝试使用接口,以便NHibernate的可以注入自己的具体实现。
使用'ICollection'而不是'List' –
或使用可以将' '改为' ' IList'而不是'List'。 –
最后但并非最不重要的是:为了坚持也来自'Children'集合的项目,应该做一些更多的调整:在,并明确地为”Children“项设置一个父项:'foo.Children.Add(new Bar {Description =”desc1“,Parent = foo});'。 –