Je suis en train d'écrire un devoir pour ma classe RDBMS, j'ai besoin d'effectuer des opérations CRUD sur un domaine assez simple, qui est le championnat de cyber-sport.
Les étudiants doivent utiliser ADO.NET. Ma question est comment puis-je résoudre relation bidirectionnelle, par exemple 1: m (chaque championnat a beaucoup de matches, mais chaque match appartient à un seul championnat exact)? Il me semble qu'il doit y avoir une technique pour cela.
Et la partie la plus intéressante pour moi est - comment ORM comme EF ou NHibernate résoudre cette situation?Comment ORM peut-il résoudre les relations bidirectionnelles entre entités (NHibernate, par exemple)?
Répondre
Dans NHibernate, c'est assez simple et direct. Voici à quoi ressembleront les classes de domaine, suivies de mappages fluides. Cela suppose que vous utiliseriez NHibernate pour générer votre schéma. Si vous mappez une base de données existante, il est facile de définir les noms de colonnes et de tables utilisés.
public class Championship {
public virtual int Id { get; set; }
public virtual IList<Match> Matches { get; set; }
}
public class Match {
public virtual int Id { get; set; }
public virtual Championship Champioship { get; set; }
}
public class ChampionshipMap : ClassMap<Championship> {
public ChampionshipMap() {
Id(x => x.Id);
HasMany(x => x.Matches);
}
}
public class MatchMap : ClassMap<Match> {
public MatchMap() {
Id(x => x.Id);
References(x => x.Championship);
}
}
Jetez un oeil à Davy Brions Blog sur la construction de votre propre couche d'accès aux données. Il parle de toutes ces sortes de défis.
Pour quelque chose comme plusieurs-à-plusieurs avec Hibernate, vous définissez la relation. Voici un exemple (référence est here:
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<set name="addresses" table="PersonAddress">
<key column="personId"/>
<many-to-many column="addressId"
class="Address"/>
</set>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<set name="people" inverse="true" table="PersonAddress">
<key column="addressId"/>
<many-to-many column="personId"
class="Person"/>
</set>
</class>
Du côté de la base de données elle-même, pour beaucoup-à-plusieurs, vous aurez généralement une table de lien
Nous aurions:.
PERSON
ADDRESS
PERSON_ADDRESS
La table PERSON_ADDRESS contient person_id et id_adresse pour relier les deux entités, ce qui permet à une personne d'avoir plusieurs adresses et une même adresse à plusieurs personnes ou sociétés.
Pour 1: m relation, il est assez bon pour avoir ceci:
PERSON
ADDRESS
Dans l'adresse, vous auriez la colonne person_id, mais il pourrait y avoir de nombreux enregistrements d'adresses pour un person_id donné, vous donnant 1 : m capacité.
Par exemple, dans DataObjects.Net vous pouvez écrire ci-dessous pour obtenir automatiquement associée Championship.Matches
entité jeu et Match.Championship
champ persistant.
[HierarchyRoot]
public class Championship : Entity
{
[Field, Key]
public int Id { get; set; }
[Field, Association(PairTo="Championship")]
public EntitySet<Match> Matches { get; private set; }
}
[HierarchyRoot]
public class Match : Entity
{
[Field, Key]
public int Id { get; set; }
[Field]
public Championship Championship { get; set; }
}
- 1. NHibernate fluide Automatisation des relations bidirectionnelles
- 2. Modèles de relations bidirectionnelles avec nhibernate
- 3. Comment stocker des relations bidirectionnelles
- 4. Relations bidirectionnelles dans ActiveRecord
- 5. KODO: comment configurer récupérer le plan pour les relations bidirectionnelles?
- 6. Relations entre les tables
- 7. NHibernate Recherche par exemple
- 8. aide à optimiser la requête (montre la force des relations bidirectionnelles entre les contacts)
- 9. stratégie pour passer des entités nhibernate entre les pages
- 10. Configurer la mise en cache sur les entités et les relations dans Fluent Nhibernate?
- 11. nhibernate fluide m-à-m avec la colonne
- 12. nHibernate mapping pour l'entité à plusieurs entités parentes (par exemple, Addres -> Firm, Addres -> Client)
- 13. Comment modéliser les scores relatifs entre entités dans CoreData
- 14. Comment montrer les relations entre Todo-listes?
- 15. entités NHibernate avec des tables db complexes
- 16. comment trouver des relations entre les tables
- 17. Comment supprimer plusieurs entités DB avec Nhibernate?
- 18. Propriétés récupérées, relations entre magasins
- 19. Cocoa: NSXMLParser - comment résoudre les entités définies dans la DTD
- 20. de base de données - Relations avec les entités différentes
- 21. DDD, entités apparentées dans les relations de détail maître
- 22. NHibernate - Requête par exemple - Sous-requête
- 23. Entités NHibernate et Associations multiples
- 24. Nhibernate Relations de mappage sur plusieurs colonnes
- 25. Comment filtrer un à plusieurs relations avec fluent-NHibernate?
- 26. Collecte automatique de nhibernate
- 27. Gérer correctement les entités transitoires dans NHibernate
- 28. Entity Framework, Comment inclure les entités associées dans cet exemple
- 29. Quand puis-je utiliser des relations unidirectionnelles dans NHibernate?
- 30. Créer des relations entre les tables
ok, je comprends. mais si je construis DAL à la main, comment puis-je faire cela? Je veux dire, si j'ai besoin de charger un objet de championnat, j'ai besoin de charger tous ses matchs, et cela nécessitera de charger des championnats pour chaque match, et ainsi de suite ... Il me manque quelque chose – chester89
Si ses références circulaires vous inquiètent , la collecte des ordures prendra soin de cela. De toute évidence, vous ne pouvez pas exiger le championnat dans le ctor du match et une liste de matchs dans le ctor du championnat. Mais ... vous pouvez faire en sorte que le Match prenne un Championnat dans le ctor, mais dans le Championnat, initialisez la Liste des Matchs vide et remplissez-le avec championnat.Matches.Add (new Match() {...}); En ce qui concerne votre DAL, je recommande de lire sur le Repository, l'objet d'accès aux données (Dao) et les modèles d'enregistrement actif. Je vais habituellement avec Dao moi-même. –
oui, je m'inquiète des références circulaires, merci beaucoup – chester89