使用连接表内的参数Nhibernate多对多映射

时间:2017-03-26 16:06:28

标签: c# visual-studio nhibernate many-to-many

我是编程新手,我有一个C#Visual studio项目为学校做,我们选择实现Nhibernate。

我相信我们已经接近完成了一些工作,但是有很多关联Mail困扰着我。

这是我的用户类:

public class Utilisateur
{
    public virtual int numUtilsateur { get; set; }
    public virtual String nomUtilisateur { get; set; }
    public virtual String prenomUtilisateur { get; set; }
    public virtual String adresseUtilisateur { get; set; }
    public virtual String cpUtilisateur { get; set; }
    public virtual String villeUtilisateur { get; set; }
    public virtual String telUtilisateur { get; set; }
    public virtual String mailUtilisateur { get; set; }
    public virtual float distanceParcourueSemaine { get; set; }
    public virtual String loginUtilisateur { get; set; }
    public virtual String passwordUtilisateur { get; set; }
    public virtual DateTime dateDernierLogin { get; set; }
    public virtual int nbTentatives { get; set; }

    public virtual TypeUtilisateur typeUtilisateur { get; set; }
    public virtual Planning planning { get; set; }
    public virtual PorteFeuille porteFeuille { get; set; }
    public virtual ISet<Conge> lesConges { get; set; }
    public virtual ISet<Interlocuteur> lesMails { get; set; }

    public Utilisateur()
    {

    }

    // ToString 
    public override string ToString()
    {
        return string.Format(
            "[{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|{8}|{9}|{10}|{11}|{12}|{13}|{14}]",
            nomUtilisateur, prenomUtilisateur, adresseUtilisateur, cpUtilisateur, 
            villeUtilisateur, telUtilisateur, mailUtilisateur, loginUtilisateur, 
            passwordUtilisateur, dateDernierLogin, nbTentatives, 
            distanceParcourueSemaine, typeUtilisateur, planning, porteFeuille);
    }


}

这是我的客户端类:

public class Interlocuteur
{
    public virtual int idInterlocuteur { get; set; }
    public virtual string nomInterlocuteur { get; set; }
    public virtual string prenomInterlocuteur { get; set; }
    public virtual string telInterlocuteur { get; set; }
    public virtual string mailInterlocuteur { get; set; }
    public virtual Individu individu { get; set; } 
    public virtual Structure structure { get; set; }
    public virtual PorteFeuille portefeuille { get; set; }
    public virtual ISet<Utilisateur> lesMails { get; set; }
    public virtual IList<RendezVous> lesRendezVous { get; set; }

    public Interlocuteur()
    {

    }

    // ToString 
    public override string ToString()
    {
        return string.Format("[{0}|{1}|{2}|{3}|{4}|{5}]", 
            nomInterlocuteur, prenomInterlocuteur, telInterlocuteur, mailInterlocuteur, 
            individu, structure, portefeuille);
    }
}

用户可以通过软件向客户发送邮件,我们通过Mail类跟踪邮件:

public class Mail
{
    // propriétés automatiques 
    public virtual int numMail { get; set; }
    public virtual string contenuMail { get; set; }
    public virtual string objetMail { get; set; }
    public virtual Utilisateur utilisateur { get; set; }
    public virtual Interlocuteur interlocuteur { get; set; }

    // constructeurs 
    public Mail()
    {
    }
    // ToString 
    public override string ToString()
    {
        return string.Format("[{0}|{1}|{2}|{3}]", 
            contenuMail, objetMail, utilisateur, interlocuteur);
    }
}

我需要做的是检索用户在列表中发送的所有邮件,例如:

utilisateur.lesMails

我尝试了所有类型的贴图袋,套装但没有任何效果。 软件中有另外多个关联,我在两边做了一个袋子映射,它的工作方式就像魅力一样,但这里有所不同,因为我需要获得一个Mail对象(连接类),而不是直接相反的类。 ..

有人请帮助:)!

抱歉我的英文不好,如果需要,我可以提供更多信息 如果您需要,这是MCD:

MCD

修改

这是我的邮件映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="Maquette_Belle_Table_Final" assembly="Maquette_Belle_Table_Final">
  <class name="Mail" table="mail">
    <id name="numMail" column="numMail" />
    <property name="contenuMail" column="contenuMail"/>
    <property name="objetMail" column="objetMail"/>  
    <many-to-one name="utilisateur" column="numUtilisateur" />
    <many-to-one name="interlocuteur"  column="idInterlocuteur" />
  </class>
</hibernate-mapping>

我的用户映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="Maquette_Belle_Table_Final" assembly="Maquette_Belle_Table_Final">
  <class name="Utilisateur" table="utilisateur">
    <id name="numUtilisateur" column="numUtilisateur" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="nomUtilisateur" column="nomUtilisateur"/>
    <property name="adresseUtilisateur" column="adresseUtilisateur"/>
    <property name="cpUtilisateur" column="cpUtilisateur"/>
    <property name="villeUtilisateur" column="villeUtilisateur"/>
    <property name="telUtilisateur" column="telUtilisateur"/>
    <property name="mailUtilisateur" column="mailUtilisateur"/>
    <property name="prenomUtilisateur" column="prenomUtilisateur"/>
    <property name="loginUtilisateur" column="loginUtilisateur"/>
    <property name="passwordUtilisateur" column="passwordUtilisateur"/>
    <property name="dateDernierLogin" column="dateDernierLogin"/>
    <property name="nbTentatives" column="nbTentatives"/>
    <property name="distanceParcourueSemaine" column="distanceParcourueSemaine"/>
    <many-to-one name="typeUtilisateur" column="codeTypeUtilisateur" 
        cascade="all" lazy="false"/>
    <one-to-one name="planning" constrained="true" foreign-key="none" 
        class="Planning" />
    <one-to-one name="porteFeuille" constrained="true" foreign-key="none" 
        class="PorteFeuille" />

    <set name="lesConges" table="conges_utilisateur" lazy="true">
      <key>
        <column name="numUtilisateur" not-null="true"/>
      </key>
      <many-to-many class="Conge">
        <column name="numConge" not-null="true"/>
      </many-to-many>
    </set>

    <bag name="lesMails">
      <key column="numMail" />
      <one-to-many class="Mail"/>
    </bag>

  </class>
</hibernate-mapping>

我的客户端映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="Maquette_Belle_Table_Final" assembly="Maquette_Belle_Table_Final">
  <class name="Interlocuteur" table="interlocuteur">
    <id name="idInterlocuteur" column="idInterlocuteur" unsaved-value="0">
      <generator class="native" />
    </id>

    <property name="nomInterlocuteur" column="nomInterlocuteur"/>
    <property name="prenomInterlocuteur" column="prenomInterlocuteur"/>
    <property name="telInterlocuteur" column="telInterlocuteur"/>
    <property name="mailInterlocuteur" column="mailInterlocuteur"/>
    <one-to-one name="individu" constrained="true" foreign-key="none" 
        class="Individu" />
    <one-to-one name="structure" constrained="true" foreign-key="none" 
        class="Structure" />
    <one-to-one name="portefeuille" constrained="true" foreign-key="none" 
        class="PorteFeuille" />

    <bag name="lesRendezVous">
      <key column="idRdv" />
      <one-to-many class="RendezVous"/>
    </bag>

    <bag name="lesMails">
      <key column="numMail" />
      <one-to-many class="Mail"/>
    </bag>

  </class>
</hibernate-mapping>

目前我正在检索与用户有关的邮件列表,如下所示:

List<Mail> lesMails= session
    .CreateQuery("select * from utilisateur p where p.numUtilisateur = :num")
    .SetInt16("num", utilisateur.numUtilisateur);

我想做的是nhibernate直接加载邮件列表,如下所示:

utlisateur.lesMails 

(如果当然可以。)

干杯!

修改1:

我已经尝试了以下内容:

Nhibernate: How to represent Many-To-Many relationships with One-to-Many relationships?

它不适合我,因为它给了我一个相反类的列表,而不是加入类的列表。

编辑2:

我的邮件类映射现在是:

   <?xml version="1.0" encoding="utf-8" ?>
   <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="Maquette_Belle_Table_Final"     assembly="Maquette_Belle_Table_Final">
 <class name="Mail" table="mail">
 <id name="numMail" column="numMail" unsaved-value="0">
 <generator class="native" />
 </id>
<property name="contenuMail" column="contenuMail"/>
<property name="objetMail" column="objetMail"/>  
<many-to-one name="utilisateur" column="numUtilisateur" />
<many-to-one name="interlocuteur"  column="idInterlocuteur" />
</class>
</hibernate-mapping>

我忘记了<id name="numMail" column="numMail" unsaved-value="0"> <generator class="native" /> </id>,但它仍然无法正常工作。

编辑3:

在使用utilisateur.lesMails时使用userId = 5时似乎用id = 5加载邮件,当使用userId = 2进行日志记录时,会使用id = 2加载邮件{1}},等等。如果我们使用userId=7进行登录且没有mailId = 7,即使邮件行将numUtilisateur=7作为外键,它也不会加载任何邮件。

任何线索?

1 个答案:

答案 0 :(得分:1)

如果您的UtilisateurInterlocuteur类仍然按照问题中的说明编码,则必须更改它们。

他们仍然试图直接将lesMails映射为many-to-many ISet<Interlocuteur> / ISet<Utilisateur>属性,确实短路Mail。它应该在UtilisateurInterlocuteur中更改为:

public virtual ISet<Mail> lesMails { get; set; }

在映射中更改bag的{​​{1}},从语义上讲它会更健全。 (A set接受重复的条目。您不希望将同一邮件多次关联到同一个用户,不是吗?)

bag属性必须将外键引用到子表内的父级。您正在引用孩子的主键,因此就是您见证的行为。

key中,将您的邮件收藏集映射更改为:

Utilisateur

<set name="lesMails"> <key column="numUtilisateur" /> <one-to-many class="Mail"/> </set>

Interlocuteur

您的<set name="lesMails"> <key column="idInterlocuteur" /> <one-to-many class="Mail"/> </set> 映射未为其Mail指定生成器。它被记录为强制性的,因此请指定一个。

备注:

您的示例查询应为:

id

你的众多List<Mail> lesMails = session .CreateQuery("select p.lesMail from utilisateur p where p.numUtilisateur = :num") .SetInt32("num", utilisateur.numUtilisateur) .List<Mail>(); 并不是好设计的标志。通常,one-to-one / many-to-one关系比one-to-many关系更多。前者通常比后者更容易管理。后者应保留用于强制执行one-to-one关系的情况。

您的命名约定看起来像Java。使用.Net,可见成员将使用PascalCase而不是camelCase编写。

如果收到错误,请在Stack Overflow上提供详细信息。 (至少给出错误信息。&#34;它不起作用&#34;只是说不出来。)