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; }
}
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