Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NHibernate的子-父关系_C#_Nhibernate_Orm - Fatal编程技术网

C# 使用NHibernate的子-父关系

C# 使用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

我想弄清楚如何使用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 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.PersistentGenericSet
1[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();
            }