我建有2个表:
Parents表(parent_id int(自增型),
      Name varchar(50))Childs表  (child_id int(自增型),
      Address varchar(50),
      parent_id int(与Parents表中的parent_id列相对应) )以下是父类Parent.hbn.xml的代码<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
   <class name="wangzheWebNhihernate.Parent,wangzheWebNhihernate" table="Parents">
<id type="Int32" name="ParentId" column="parent_id" unsaved-value="0">
     <generator class="identity" />
</id>
<property type="String" name="Name" column="Name" length="50"/>
<set name="Childs" cascade="all" inverse="true" lazy="false"
                    table="Childs"sort="unsorted">
   <key column="parent_id" />
   <one-to-many class="wangzheWebNhihernate.Child,wangzheWebNhihernate"/>
</set>
</class>
</hibernate-mapping>以下的是子类的Child.hbm.xml代码<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="wangzheWebNhihernate.Child,wangzheWebNhihernate" table="Childs"            dynamic-update="false" dynamic-insert="false">
   <id type="Int32" column="child_id" unsaved-value="0" name="ChildId">
  <generator class="identity" />
   </id>
   <property name="Address" column="Address" type="String" length="50"/>
   <many-to-one
name="PParent"
column="parent_id"
class="wangzheWebNhihernate.Parent,wangzheWebNhihernate"
cascade="none"
outer-join="true"
update="true"
insert="true"
access="property"
   />
</class>
 </hibernate-mapping>父类Parent的cs文件是:
public class Parent 
{
private int parentId;
private string name;
private IDictionary childs = new Hashtable(); public Parent() 
{
} public int ParentId 
{
get { return parentId; }
set { parentId = value; }
} public string Name 
{
get { return name; }
set { name = value; }
} public IDictionary Childs 
{
get { return childs; }
set { childs = value; }
}

子类Child.cs的代码为:
public class Child
{
private int child_id;
private string address;
private Parent parent; public Child() 
{
} public int ChildId 
{
get { return child_id; }
set { child_id = value; }
} public string Address 
{
get { return address; }
set { address = value; }
} public Parent PParent 
{
get 

if(parent == null) parent = new Parent();
return parent; 
}
set 
{
parent = value;
}
}
}
测试代码为:
Configuration configuration = new Configuration();
     configuration.AddXmlFile(Server.MapPath("Child.hbm.xml"));
configuration.AddXmlFile(Server.MapPath("Parent.hbm.xml"));

ISessionFactory iSessionFactory = configuration.BuildSessionFactory();                
ISession iSession = iSessionFactory.OpenSession();
ITransaction iTransaction = iSession.BeginTransaction(); Parent parent = new Parent();
         parent.Name = "wangzhe";         Child child = new Child();
     child.Address = "beijing";
child.PParent = parent; parent.Childs.Add(child,child); iSession.Save(parent);
iTransaction.Commit();
iSession.Close();
可是在保存的时候有错误,错误是Could not save object,这是为什么呀?

解决方案 »

  1.   

    还有就是我想问一下在测试代码中这句代码:parent.Childs.Add(child,child)中add的参数我这么写对吗?我总觉得不对,但看到别人的帖子上面参数是子类的一个对象我就也这么写了.
      

  2.   

    Parent parent = new Parent();
             parent.Name = "wangzhe";         Child child = new Child();
         child.Address = "beijing";
    child.PParent = parent; parent.Childs = child; //改成这样行么?
    iSession.Save(parent);
    iTransaction.Commit();
    iSession.Close();
      

  3.   

    谢谢clxxj(ChenSir之.Net外传),不过我家里的.net又点问题,我明天到单位看一下,明天给你答复,谢谢
      

  4.   

    呵呵没事,我也是刚接触NHIBERNATE.有空多交流.
      

  5.   

    我刚才看了一下,我觉得改成parent.Childs = child有点悬,因为在我的Parent.cs文件中childs是这样定义的private IDictionary childs = new Hashtable();所以我觉得应该
    parent.Childs.Add(child,child);,一个是键值,一个是值
      

  6.   

    parent.hbm.xml:
    <bag name="TheChilds" inverse="true" cascade="all-delete-orphan">
    <key column="parentID" />
    <one-to-many class="Childs, YourNameSpace" />
    </bag> parent.cs private System.Collections.IList theChilds =new ArrayList(); public System.Collections.IList TheChilds {
    get {
    return theChilds;
    }
    set {
    theChilds=value;
    }
    }这样就可以直接将
    parent.Childs = child;
      

  7.   

    刚才忘了说了,谢谢呀clxxj(ChenSir之.Net外传)
      

  8.   

    哈哈,我弄出来了,在这里先谢谢clxxj(ChenSir之.Net外传),我是按照你的方法改的,不过parent.Childs = child;在编译时会报错,错误是指定的转换类型无效,当把这句改成parent.myChilds.Add(child);就可以了.还有就是想问你想要多少分呀,我给你加上,
      

  9.   

    我把改动给你说一下吧,总共就改了2处.第一处是在父类Parent.hbn.xml的代码中
    <set name="Childs" cascade="all" inverse="true" lazy="false"
                table="Childs"sort="unsorted">
       <key column="parent_id" />
       <one-to-many class="wangzheWebNhihernate.Child,wangzheWebNhihernate"/>
    </set>
    把标记set改成bag
    第二处是在parent.cs中

    private System.Collections.IList theChilds =new ArrayList();
             //原来写的是private IDictionary childs = new Hashtable();
    public System.Collections.IList TheChilds {
    get 
                  {
    return theChilds;
    }
    set 
                  {
    theChilds=value;
    }
    }
             //原来写的是
              public IDictionary myChilds 
    {
    get { return childs; }
    set { childs = value; }
    }
    就改了这么两处,剩下的和最上面我发的帖子里的内容一样.
    还有就是我给你加100分拉,我的msn是[email protected],有空的话加我,咱们有时间多交流
      

  10.   

    我也在学习Nhibernate ,大家帮帮我,好多地方我不明白