2009-08-19 10 views
2

J'essaie de créer un système de messagerie entre les utilisateurs et les organisations, c'est-à-dire qu'un utilisateur peut envoyer et recevoir des messages d'utilisateurs ou d'organisations.Génériques avec Fluent et NHibernate

Ainsi, pour soutenir ce système, j'ai commencé avec une interface:

public interface IPassableObject<F, T, O> 
    where F : DomainObject 
    where T : DomainObject 
{ 
    Guid PassedItemId { get; set; } 
    O Item { get; set; } 
    F From { get; set; } 
    T To { get; set; } 
    DateTime Created { get; set; } 
} 

L'idée est plus tard, je voudrais être en mesure de passer plus que des messages - comme des objets sérialisés. Donc, nous avons une classe avec 3 types génériques. À, De, et l'objet

Puis j'ai créé ma classe de message

public class Message<T, F> : DomainObject, IPassableObject<T, F, string> 
    where F : DomainObject 
    where T : DomainObject 
{ 

    public Message() 
    { 
     Created = DateTime.Now; 
    } 

    #region IPassableObject<T,F> Members 

    public virtual Guid PassedItemId { get; set; } 

    public virtual string Item { get; set; } 

    public virtual T From { get; set; } 

    public virtual F To { get; set; } 

    public virtual DateTime Created { get; set; } 

    #endregion 
} 

Puis, je fis ma table pour soutenir mes articles passés:

CREATE TABLE dbo.PassedItems 
(
    PassedItemId   uniqueidentifier  NOT NULL, 
    FromId     uniqueidentifier  NOT NULL, 
    ToId     uniqueidentifier  NOT NULL, 
    SerializedObject  varchar(max)   NOT NULL, 
    Created     datetime    DEFAULT(GETEDATE()) NOT NULL, 

    CONSTRAINT PK_PassedItems PRIMARY KEY CLUSTERED (PassedItemId) 
) 

Années pour mon d'ID les utilisateurs et les organisations sont des guids. Maintenant, j'ai ma cartographie fluide pour les messages Utilisateur - Utilisateur. Ma pensée est que je n'aurai qu'à créer 4 mappings et ne pas maintenir 4 classes séparées pour user-user, user-org, org-user, et org-org. J'espérais que Nhibernate prendrait le guid dans la table et essayerait automatiquement d'insérer l'objet en fonction du type spécifié.

public class UserToUserMessageMap : ClassMap<Message<UserProfile, UserProfile>> 
{ 
    public UserToUserMessageMap() 
    { 
     WithTable("PassedItems"); 

     Id(x => x.PassedItemId, "PassedItemId").GeneratedBy.Guid(); 

     Map(x => x.Item, "SerializedObject"); 
     Map(x => x.Created); 

     References(x => x.From, "FromId"); 
     References(x => x.To, "ToId"); 
    } 
} 

La question que je vois est que quand je lance mon application, je reçois une erreur d'exécution:

NHibernate.MappingException: An association from the table PassedItems does not specify the referenced entity

Ainsi, cette approche va encore travailler? Qu'est-ce que je fais mal? Merci!

+0

J'ai essayé de changer les références en spécifiant un type. Malheureusement, cela n'a pas fonctionné non plus: Références (x => x.From, "FromId"); – Josh

+0

FYI - nous utilisons FluentNHibernate version 0.1.0.363 et NHibernate version 2.0.1.4000 – Josh

Répondre

0

J'ai trouvé une solution à mon problème. Pour donner un aperçu approximatif de ce que j'ai fait:

J'ai dû jeter les génériques.

J'ai mon interface, IPassable.

J'ai une classe abstraite qui implémente IPassable: PassableBase

Je mon PassableItem de classe « factice » qui est héritée de PassableBase. Cette classe ne fait rien en dehors des valeurs par défaut définies dans PassableBase.

Message est une classe qui hérite également de PassableBase. Les autres objets passés devront hériter de PassableBase.

Ma correspondance Fluent utilise PassableItem.Mes référentiels utilisent PassableBase pour les paramètres d'entrée et je crée un nouvel PassableItem ou j'obtiens un PassableItem du magasin (selon qu'il est déjà créé ou non), puis je sauvegarde/supprime l'objet PassableItem.

0

Alors qu'est-ce que le mappage pour 'De' & 'À' ressemble?

Parce que je pense que NH ne sait pas comment cartographier ces entités parce que vous n'avez pas fourni les informations de cartographie.

En général, il me semble que vous avez réinventé la roue, avez-vous regardé des piles de technologies comme les services Web (SOAP & REST), la mise en file d'attente des messages, l'accès distant (.Net). Et les implémentations spécifiques comme WCF, ASMX (services Web), nServiceBus, MassTransit, MSMQ pour ne citer que quelques-uns ...

Ollie

+0

From et To dans cette instance sont objet UserProfile qui sont mappés et ont fonctionné pendant un certain temps. Je pense que vous vous méprenez. Un "message" dans ce cas n'est pas un protocole de transport. C'est un véritable système de messagerie où les utilisateurs reçoivent des messages dans une boîte de réception, et finalement je veux être en mesure d'étendre le système pour permettre aux utilisateurs et aux organisations d'envoyer plus que du texte. – Josh