Вставить в родительские и дочерние таблицы - PullRequest
0 голосов
/ 02 декабря 2010

Привет У меня есть родительский и дочерний стол, как показано ниже

<?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 ]

1 голос
/ 02 декабря 2010

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

session.Save(st);

Вы также должны указать inverse = "true" на сумке, чтобы не получать двойных обновлений внешнего ключа, и, вероятно, здесь уместен cascade = "all-delete-orphan", так как вы хотите, чтобы все StudentMarks были удалены когда ученик удален.

0 голосов
/ 02 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...