C# 使用NHibernate的子-父关系
我想弄清楚如何使用NHibernate建立孩子与父母的关系。 我有两门课:Foo和Bar。Foo有一个条形图集合,条形图引用了父FooC# 使用NHibernate的子-父关系,c#,nhibernate,orm,C#,Nhibernate,Orm,我想弄清楚如何使用NHibernate建立孩子与父母的关系。 我有两门课:Foo和Bar。Foo有一个条形图集合,条形图引用了父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 Ba
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; }
}
下面是我如何添加新的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();
}
Foo-Foo=newfoo{Name=“name1”};
foo.Children=新列表();
Add(新条{Description=“desc1”});
Add(新条{Description=“desc2”});
使用(ISession session=nhibirnateheloper.OpenSession())
使用(ITransaction transaction=session.BeginTransaction())
{
session.Save(foo);
Commit();
}
调用Save(foo)方法时,我遇到了一个异常“Invalid Cast(检查映射中的属性类型不匹配);setter of Test.foo”。
带iinere异常:“无法强制转换对象类型\”NHibernate.Collection.Generic.PersistentGenericSet1[Test.Bar]\“imk_ППП\”System.Collections.Generic.List
1[Test.Bar]\”
我做错了什么?尝试将
公共虚拟列表子项{get;set;}
更改为公共虚拟ISet子项{get;set;}
。ISet可以在Iesi.Collections.Generic.ISet
中找到
您甚至可以尝试使用
IList
而不是List
,看看它是否有效。避免为集合使用具体类,并尝试使用接口,以便Nhibernate可以注入自己的具体实现。尝试将公共虚拟列表子项{get;set;}
更改为公共虚拟ISet子项{get;set;}
.ISet可以在Iesi.Collections.Generic.ISet
中找到
您甚至可以尝试使用
IList
而不是List
,看看它是否有效。避免为集合使用具体类,并尝试使用接口,以便Nhibernate可以注入自己的具体实现。使用ICollection
而不是List
,或者使用可以将
更改为
,并且然后使用IList
而不是List
。最后但并非最不重要的一点是:为了保存Children
集合中的项目,还需要做一些调整:在
中设置级联属性,并明确地为子项设置父项:foo.Children.Add(新条{Description=“desc1“,Parent=foo})使用ICollection
而不是List
,或者使用可以将
更改为
,然后使用IList
而不是List
。最后但并非最不重要的一点是:为了保存子类
集合中的项目,还需要做一些调整:在中设置一个级联属性明确地为子项取消>并设置父项:foo.Children.Add(新条{Description=“desc1”,parent=foo});
。
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();
}