插入父表和子表

时间:2010-12-02 04:38:54

标签: nhibernate

您好 我有如下的父母和子女表

<?xml version="1.0" encoding="utf-8"?>

                    ------- parent --------------
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="HibernateSample.StudMarks,HibernateSample" table="StudMarks" lazy="false">
    <id name="Sno" column="SNO" type="int">
      <generator class="assigned"/>
    </id>
    <many-to-one name="Student" column="ID" not-null="true"/>
    <property name="Marks" column="Marks" type="int" not-null="true" />
    <property name="Rank" column="Rank" type="int" not-null="true" />
  </class>
</hibernate-mapping>

               ------- child --------------
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="HibernateSample.Student,HibernateSample" table="Student" lazy="false">
    <id name="Id" column="ID" type="int">
      <generator class="native" />
    </id>
    <property name="Name" column="Name" type="string" not-null="true" />
    <property name="Standard" column="Standard" type="string" not-null="true" />
    <bag name="StudMarks" cascade="all" lazy="false">
      <key column="ID" not-null="true"/>
      <one-to-many class="HibernateSample.StudMarks,HibernateSample" />
    </bag>
  </class>
</hibernate-mapping>

并在.cs文件中,我喜欢像下面这样编写代码插入父母和孩子。

        StudMarks sm = new StudMarks(); 
        Student st = new Student();
        List<StudMarks> sms = new List<StudMarks>();
        st.Id = 9;
        st.Name = "stud 999";
        st.Standard = "99";
        sm.Sno = 9;
        sm.Marks = 99;
        sm.Rank = 9;            

        sm.Student = st;              ------ **Line 1**
        st.StudMarks = sms;           ------ **Line 2**

        session.Save(sm);            
        session.Flush();

如果我在上面的代码中通过“第1行”,则仅插入子项。如果我评论“第2行”外键约束错误正在抛出。

表格

CREATE TABLE [dbo].[Student](
[ID] [int] IDENTITY(1,1) NOT NULL, -- PRIMARY KEY
[Name] [varchar](50) NOT NULL,
[Standard] [varchar](50) NOT NULL,

CREATE TABLE [dbo].[StudMarks](
[SNO] [int] NOT NULL, -- PRIMARY KEY
[ID] [int] NOT NULL, -- FOREIGN KEY
[Marks] [int] NOT NULL,
[Rank] [int] NOT NULL,)

请让我知道如何在单次保存操作中一次插入父母和子女。

2 个答案:

答案 0 :(得分:1)

您与Student-&gt; StudentMarks有级联关系。所以你应该保存st ...

session.Save(st);

您还应该在包上指定inverse =“true”,这样您就不会获得外键的双重更新,并且cascade =“all-delete-orphan”可能适用于此处,因为您希望删除所有StudentMark学生被删除时。

答案 1 :(得分:0)

我认为您需要在StudMarks集合属性的inverse="true"映射上指定Student,表明StudMark映射是该关系的所有者。

相关问题