Nhibernate: проблема отображения отношений один ко многим - PullRequest
1 голос
/ 26 января 2012

Я очень, очень новичок в nhibernate, и я уверен, что есть много очевидных вещей, которые я пропускаю здесь, но я искал ответ в течение нескольких дней и просто не могу найти решение, которое соответствует моей конкретной проблеме. Я очень, очень ценю вашу помощь.

Сначала я опишу свою проблему, а затем отправлю код:

В моей объектной модели у меня есть «Событие» с IList «Организатор». Я хочу использовать nhibernate, чтобы при выполнении сеанса «session.Save (anEvent)» данные записывались в три таблицы в базе данных: «События», «Организаторы» и «Организаторы_ события» (таблица соединения). Когда я использую приведенный ниже код, я получаю следующую ошибку:

Invalid column name 'EventID'

Мой код: Во-первых, файлы .hbm:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BLL"
                   namespace="BusinessLogic">

  <class name="Event" table="Events">
    <id name="EventID">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="Name">
      <column name="Name"/>
    </property>
    <bag name="Organizers" table="Organizers_Events" inverse="false" cascade="all-delete-orphan" lazy="true" access="nosetter.camelcase-underscore" >
      <key column="EventID"/>
      <one-to-many class="Organizer" />
    </bag>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BLL"
                   namespace="BusinessLogic">

  <class name="Organizer" table="Organizers">
    <id name="Id">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="FullName">
      <column name="FullName"/>
    </property>
    <many-to-one name="TheEvent" column="EventID" />
  </class>
</hibernate-mapping>

Далее объекты:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for Event
/// </summary>
/// 

namespace BusinessLogic
{
    public class Event
    {
        private int eventID;

        public virtual int EventID
        {
            get { return eventID; }
            set { eventID = value; }
        }
        private IList<Organizer> _organizers = null;

        public virtual IList<Organizer> Organizers
        {
            get { return _organizers; }
            set { _organizers = value; }
        }
        public Event()
        {
            //
            // TODO: Add constructor logic here
            //
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BusinessLogic
{
    public class Organizer:Invitee
    {
        private Event theEvent = new Event();

        public virtual Event TheEvent
        {
            get { return theEvent; }
            set { theEvent = value; }
        }
    }
}

И, наконец, схема базы данных:

CREATE TABLE [dbo].[Events](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Organizers](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FullName] [nvarchar](550) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Organizers_Events](
    [OrganizerID] [int] NOT NULL,
    [EventID] [int] NOT NULL
) ON [PRIMARY]

Я вырезал ненужные данные, чтобы упростить проблему. Я не думаю, что какие-либо другие вещи влияют на мою проблему здесь. Для наших целей я просто хочу, чтобы объект Event записывал свои EventID и Name в таблицу Events, каждый объект организатора в IList записывает свой ID и FullName в таблицу Organizers, а EventID и ID Organizer записываются в Таблица Organizer_Events.

Что я делаю не так? Если это много, пожалуйста, скажите мне. Или, если в сети уже есть ответ, который я пропустил, направьте меня к нему.

Ответы [ 2 ]

3 голосов
/ 26 января 2012

В ассоциации один-ко-многим вам не нужен объединительный стол. Соединительные таблицы требуются только при множестве ассоциаций. Правильное отображение

<bag name="Organizers" inverse="false" cascade="all-delete-orphan" lazy="true" access="nosetter.camelcase-underscore" >
    <key column="EventID"/>
    <one-to-many class="Organizer" />
</bag>

Правильная схема БД для связи один-ко-многим

CREATE TABLE [dbo].[Events]
(
  [ID] [int] IDENTITY(1,1) NOT NULL,
  [Name] [nvarchar](max) NOT NULL
)
 ON [PRIMARY] 

CREATE TABLE [dbo].[Organizers]
( 
 [ID] [int] IDENTITY(1,1) NOT NULL, 
 [FullName] [nvarchar](550) NULL,
 [EventID] [int] NOT NULL // add FK constraint here
) 
ON [PRIMARY]   
0 голосов
/ 26 января 2012

Я думаю, что вы забыли вставить в свою сумку объявление "=" ложь ":

<bag name="Organizers" inverse="false" table="Organizers_Events" cascade="all-delete-orphan" lazy="true" access="nosetter.camelcase-underscore" >
...