2009-09-24 16 views
1

Selon cet article: http://subsonicproject.com/docs/3.0_MigrationsComment gérez-vous les 'relations' de SubSonic avec la migration?

Bottom line: if you're a developer that is concerned about database design, 
migrations might not be for you. 

Ok, c'est très bien, je peux traiter la base de données comme un simple référentiel persistant de données qui ne contient pas de logique métier. En d'autres termes, un fichier texte glorifié.

Ce que je ne sais pas comment faire est de relier deux objets ensemble. Prenons par exemple ces deux classes:

public class Disaster 
{ 
    public int DisasterId { get; set; } 
    public string Name { get; set; } 
    public DateTime? Date { get; set; } 
    public IList<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int AddressId { get; set; } 
    public string WholeAddressHereForSakeOfBrevity { get; set; } 
} 

Disaster contient une IList de plusieurs Addresses qui ont été touchés par la catastrophe. Lorsque j'utilise SimpleRepository pour les ajouter à la base de données avec SimpleRepositoryOptions.RunMigrations, il génère les tables avec toutes les colonnes, mais pas les colonnes de clé étrangère comme prévu.

Comment est-ce que je rapporterais ces deux ensemble de sorte que quand j'appelle Disaster.Addresses, j'obtiens une liste de tous les Addresses affectés? Est-ce possible ou dois-je utiliser ActiveRecord à la place et créer les tables de base de données en premier? Ou dois-je ajouter dans une colonne pour l'ID de la catastrophe dans Address? Si oui, comment cette méthode fonctionne-t-elle pour les relations plusieurs-à-plusieurs?

Répondre

1

C'est possible - vous le faites à la main, c'est tout. Ajoutez une propriété à Disaster appelée "Adresses" et faites-en une IList <> (ou vous pouvez la rendre IQueryable si vous le souhaitez dans Lazy Load). Lorsque vous récupérez votre désastre, assurez-vous de récupérer vos adresses.

C'est en quelque sorte "manuel" - mais c'est l'idée. Je travaille sur des améliorations à ce que j'espère pousser dans une version ultérieure. Et avant de vous demander pourquoi je ne l'ai pas fait en premier lieu :) c'est parce que je ne sais pas si je devrais utiliser un Many to Many ou 1-many basé sur la relation parent/enfant. Dans votre exemple, je suppose que c'est probablement 1 à plusieurs, mais compte tenu de ce que je sais sur les adresses et les catastrophes (en particulier en Floride), il devrait probablement être beaucoup à plusieurs. Bottom Line - comment SubSonic le sait-il? Nous pourrions introspecter les deux objets pour "bidirectionnalité", ce qui signifie que si l'Adresse a beaucoup de désastres, c'est beaucoup plus que d'autres (ce qui est évident) - mais ce n'est pas un bon code si vous aimez DDD. Je suis penché vers cette règle avec un certain type de dérogation qui forcerait le problème. Vos pensées à ce sujet sont les bienvenues :)

+0

Comme vous pouvez le voir dans le code que j'ai fourni dans mon post original, j'ai ajouté un IList (que j'ai maintenant converti en IQueryable parce que je veux un chargement paresseux) à la classe Disaster . Cependant, je ne suis pas sûr de ce que vous entendez par «soyez sûr de récupérer vos adresses». Comment saurais-je quelles adresses récupérer si cette association n'est pas stockée dans la base de données? –

+0

Si ce n'est pas lié à la base de données ... eh bien, vous me l'avez perdu. Si c'est dans un autre système, appelez-le quand vous en avez besoin. –