2010-12-02 2 views
0

Привет У меня есть родитель и ребенок таблица, как показано нижеВставка родительских и дочерних таблицы

<?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(); 

Если i commENT «Линия 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,) 

Пожалуйста, дайте мне знать, как вставить в родителя и ребенка в то время, в одной операции сохранения.

+0

Любая причина, по которой вы не добавляете «см» в список «смс», прежде чем назначать st.StudMarks? –

+0

Я добавил sms.Add (см); перед «Линией 1» и работает без изменения файла hbm. большое спасибо. – jcreddy

ответ

0

Я считаю, что вам нужно указать inverse="true" на Student отображении свойства коллекции StudMarks, указывая, что StudMark отображение является владельцем отношений.

1

У вас есть каскадное отношение от Student-> StudentMarks. Таким образом, вы должны экономить ул ...

session.Save(st); 

Вы также должны указать обратный = «истинный» на сумке, так что вы не получите двойные обновления внешнего ключа и каскадом = "все-удалить-сирота ", вероятно, здесь подходит, так как вы хотите удалить все StudentMarks при удалении Студента.

+0

Я добавил sms.Add (см); перед «Линией 1» и работает без изменения файла hbm. большое спасибо. – jcreddy

Смежные вопросы