Minimum et de façon correcte à la carte un-à-plusieurs avec NHibernate
Je suis nouvelle dans NHibernate et C#, donc s'il vous plaît être doux!
J'ai les deux NHibernate entités:
Employee
{
private long _id;
private String _name;
private String _empNumber;
private IList<Address> _addresses;
//Properties...
}
et
Address
{
private long _id;
private String _addrLine1;
private String _addrLine2;
private String _city;
private String _country;
private String _postalCode;
//Properties
}
et ils ont un one-to-many
relation de Employee
à Address
(chaque
l'employé peut avoir plusieurs adresses dans leur dossier). Idéalement en ignorant
le fait que plus d'un employé peuvent résider à la même adresse.
Je comprends ce du point de vue d'objets en mémoire (le NHibernate
les entités). Ce que j'ai du mal avec les fichiers de mappage (et je prends un
simple exemple ici). C'est ce que j'ai à ce jour:
//Intentionally left out XML and <hibernate-mapping>
//Mappings for class 'Employee'. -->
<class name="Employee" table="Employees">
<id name="ID">
<generator class="native">
</id>
<property name="Name" />
<property name="EmpNumber" />
<bag name="Addresses">
<key column="AddressId" />
<one-to-many class="Address" />
</bag>
</class>
et
//Intentionally left out XML and <hibernate-mapping> .
//Mappings for class 'Address'
<class name="Address" table="Addresses">
<id name="ID">
<generator class="native">
</id>
//Intentionally left out name="Employee"
//as I don't have corresponding field in Address entity.
<many-to-one class="Employee" column="EmployeeID" cascade="all" />
<property name="AddrLine1" />
<property name="AddrLine2" />
<property name="City" />
<property name="Country" />
<property name="PostalCode" />
</class>
- Est-ce correct?
- Si non, il me semble que ce qui me manque ici, c'est un champ dans la
Address
entité qui est une référence à la correspondanteEmployee
entité. Mais si
alors, je ne comprends pas pourquoi cela est nécessaire: je n'ai pas besoin d'aller chercher une
Address
à partir d'unEmployee
, seulement dans l'autre sens...
- Il me semble que vous avez besoin d'un beaucoup de beaucoup de relation ici et pas un seul de beaucoup si les adresses sont uniques dans la table d'adresses. Ce serait un de nombreux de nombreux de la table qui stocke un id d'employé et un code d'adresse. De cette façon, un employé peut être liée à une ou plusieurs adresses et adresse peut appartenir à plus de 1 employé.
- Je ne veux pas les adresses appartenir à plus d'un employé. C'est délibéré.
- Si c'est le cas, vous devrez ajouter un id d'employé dans la table d'adresses pour repérer les adresses appartiennent à qui les employés. Si plusieurs adresses peuvent exister dans la table d'adresses avec le même id de l'employé. C'est de cette façon nhibernate voudrais savoir comment remplir
private IList<Address> _addresses;
dans leEmployee
objet. Je voudrais aussi vous suggère d'avoir unEmployee
objet dans le cadre de laAddress
objet que la navigation sur les deux côtés de la relation vient souvent en pratique, même si il ne fait pas nécessairement sens à partir d'une logique d'entreprise point de vue de tous les temps. - Pourquoi êtes-vous en ajoutant cascade tous à partir de l'adresse au lieu de l'employé?
- a) Pourriez-vous ajouter ce que une réponse? b) Est-il un moyen d'ajouter de la colonne EmployeeID l'Adresse dans la table DB sans une
Employee
de référence dans leAddress
entité? - Je pensais que c'est ce qui est nécessaire pour supprimer tous les
Address
entités lors de leur correspondantEmployee
entité est supprimée. Pourriez-vous ajouter ce que une réponse? Merci.
Vous devez vous connecter pour publier un commentaire.
Juste quelques conseils, en résumant le plus adapté normes, je l'ai découvert lors d'un travail avec NHibernate.
1) Si il y a un bi-directionnelle de référence dans persitence (DB colonne), de l'exprimer en
C#
code bi-directionnelle ainsi.D'autres termes, si un enfant la référence à parent, parent devrait faire référence aux enfant.
Cela représente dans le Domaine des Affaires tel qu'il est. Adresse appartient à l'Employé et l'Employé appartient à l'Adresse.
2) Utiliser
inverse="true"
. Ce ne pouvait être utilisé que si nous avons cartographié les deux côtés (comme ci-dessus), et sera plus "prévu et optimisé" INSÉRER et mettre à JOUR les scritpsLire la suite ici:
inverse = “true” exemple et explication par mkyong
3) Utiliser le chargement par lot de cartographie presque partout. À éviter 1 + N des problèmes lors de l'interrogation. Lire la suite:
quelques détails sur le chargement par lot
4) Dans le cas où, qu'un objet
(in our case Employee)
estroot
(les autres ne font pas tellement de sens sans elle) - utilisation en cascade. Lire la suite:nhibernate - Créer de l'enfant par la mise à jour de mère, ou de créer de façon explicite?
Règles 2,3,4 dans une cartographie extraits de:
3) si l'on utilise
inverse="true
ne pas oublier de donner les deux côtés de la relation (surtout critique lors de la création)La raison en est:
Ce qui devrait être la norme de code pour créer une nouvelle Adresse
On peut aussi présenter une méthode comme
AddAddress()
qui permet de masquer cette complexité, mais le réglage des deux côtés est une bonne prectice.inverse="true"
est à l'aide de Java exemples.Vous devez ajouter la cascade
all-delete-orphan
dans leone-to-many
relation, si vous supprimez leEmployee
l'adresse sera supprimé aussi.Si vous n'avez pas besoin
Employee
de référence de créer uninverse=false
relation comme ceci: ici