2009-12-16 4 views
0

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

1

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); 
    } 
} 
+0

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

+0

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. –

+0

oui, je m'inquiète des références circulaires, merci beaucoup – chester89

1

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.

0

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é.

0

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