Nhibernate: Отображение условных отношений «многие ко многим»? - PullRequest
4 голосов
/ 29 января 2012

У меня есть следующая объектная модель:

public class Organizer
{
    private int id;

    public virtual int Id
    {
        get { return id; }
        set { id = value; }
    }

    private string fullName = "";

    public virtual string FullName
    {
        get { return fullName; }
        set { fullName = value; }
    }

    private List<Email> emails = new List<Email>();

    public virtual List<Email> Emails
    {
        get { return emails; }
        set { emails = value; }
    }
}


public enum EmailType
{
    Primary, Secondary
}

public class Email
{
    private int iD;

    public virtual int ID
    {
        get { return iD; }
        set { iD = value; }
    }
    private string emailAddress = "";

    public virtual string EmailAddress
    {
        get { return emailAddress; }
        set { emailAddress = value; }
    }
    private EmailType emailType = EmailType.Primary;

    public virtual EmailType EmailType
    {
        get { return emailType; }
        set { emailType = value; }
    }

    private List<Organizer> organizers;

    public virtual List<Organizer> Organizers
    {
        get { return organizers; }
        set { organizers = value; }
    }
}

И у меня есть следующая схема базы данных:

CREATE TABLE [dbo].[EmailAddresses](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [EmailAddress] [nvarchar](550) NULL
)

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

CREATE TABLE [dbo].[Organizers_PrimaryKeys](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [PrimaryKeyID] [int] NULL,
    [PrimaryKeyTypeID] [int] NULL,
    [OrganizerID] [int] NULL
)

Теперь у меня возникли серьезные проблемы с выяснением, как отобразить этос nhibernate (не свободно nhibernate).По сути, я хочу, чтобы он отображался таким образом, чтобы при выполнении «session.Save (anOrganizer)» данные иногда записывались в две таблицы, а иногда - в три.Например, скажем, у нас есть OrganizerA, и у него есть три электронных письма: email_1, email_2 и email_3.email_1 имеет EmailType.Primary, в то время как два других имеют EmailType.Secondary.Поэтому, когда мы сохраняем OrganizerA, происходит следующее:

  1. Сведения OrganizerA записываются в таблицу Organizer
  2. email_1, email_2 и email_3 все записываются в таблицу EmailAddresses (если онитам уже не существует)
  3. И в таблице Organizers_PrimaryKeys создается новая строка, в которой идентификатор email_1 записывается как PrimaryKeyID, а идентификатор OrganizerA записывается как OrganizerID (не беспокойтесь о PrimaryKeyTypeID.позже)

Так как, черт возьми, я могу сопоставить такие отношения?Пока у меня есть следующее:

<?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>
    <bag name="Emails" table="Organizers_PrimaryKeys" inverse="false" cascade="all" lazy="true" >
      <key column="Id"/>
      <many-to-many class="Email" />
    </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="Email" table="EmailAddresses">
    <id name="ID">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="EmailAddress" unique="true" type="string" >
      <column name="EmailAddress"/>
    </property>

  </class>
</hibernate-mapping>

Я понятия не имею, что добавить в Email.hbm.xml для завершения этого «условного» отношения «многие ко многим».

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Вам необходимо разделить основной и дополнительный адрес электронной почты на два разных объекта, поскольку они не являются сущностями одного и того же типа.Добавьте класс Organizer отношение «один к одному» к PrimaryEmail и сохраните текущий список SecondaryEmail «многие ко многим».

<?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>
   <one-to-one name="PrimaryEmail" class="PrimaryEmail" />
   <bag name="Emails" table="EmailAddresses" inverse="false" cascade="all" lazy="true" >
     <key column="Id"/>
     <many-to-many class="SecondaryEmail" />
   </bag>
  </class>

  <class name="PrimaryEmail" table="Organizers_PrimaryKeys">
    <id name="ID">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="EmailAddress" unique="true" type="string" >
      <column name="EmailAddress"/>
    </property>
  </class>

  <class name="SecondaryEmail" table="EmailAddresses">
    <id name="ID">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="EmailAddress" unique="true" type="string" >
      <column name="EmailAddress"/>
    </property>
  </class>

0 голосов
/ 30 января 2012

email_1, email_2 и email_3 добавляются в таблицу Организаторов как свойства

...