C# Nhibernate:映射条件多对多关系?

C# Nhibernate:映射条件多对多关系?,c#,asp.net,nhibernate,nhibernate-mapping,C#,Asp.net,Nhibernate,Nhibernate Mapping,我有以下对象模型: 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 ful

我有以下对象模型:

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; }
    }
}
现在,我在弄清楚如何用nhibernate(不是流利的nhibernate)来映射这一点上遇到了严重的问题。基本上,我希望对其进行映射,以便在执行“session.Save(anOrganizer)”时,数据有时写入两个表,有时写入三个表。例如,假设我们有OrganizerA,他有三封电子邮件:email_1、email_2和email_3。email_1具有EmailType.Primary,而其他两个具有EmailType.Secondary。因此,当我们保存OrganizerA时,会发生以下情况:

  • OrganizerA的详细信息将被写入表格组织者
  • email_1、email_2和email_3都会写入EmailAddresses表(如果它们还不存在的话)
  • 在Organizer_PrimaryKeys表中创建了一个新行,其中email_1的id被写为PrimaryKeyID,OrganizerA的id被写为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中放入什么来完成这个“有条件的”多对多关系。

    Email\u 1、Email\u 2和Email\u 3作为属性附加到Organizers表中

    您需要将发送到两个不同对象的主电子邮件和次电子邮件分开,因为它们不是同一种实体。将Organizer class a一对一关系添加到PrimaryEmail,并保留当前多对多的Secondary Email列表

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

    真的吗?这就是答案?我认为这是对标准化数据库模式的挑战。杜思君:这是一个黑客攻击,不是答案。谢谢你的回复。你肯定让我走对了路。有时我真的很难以一种更友好的方式对我的域模型进行不同的思考。最后,考虑到primaryEmail与organizer是一对一的关系,我只是将它作为一列添加到db中的Organizers表中,并相应地更改了organizer.hbm.xml。我准确地复制了你的第二封电子邮件建议。现在它工作得很好。非常感谢。
    <?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>