我是编程新手,我有一个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:
修改
这是我的邮件映射:
<?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
作为外键,它也不会加载任何邮件。
任何线索?
答案 0 :(得分:1)
如果您的Utilisateur
和Interlocuteur
类仍然按照问题中的说明编码,则必须更改它们。
他们仍然试图直接将lesMails
映射为many-to-many
ISet<Interlocuteur>
/ ISet<Utilisateur>
属性,确实短路Mail
。它应该在Utilisateur
和Interlocuteur
中更改为:
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;只是说不出来。)