2009-08-19 11 views
2

ユーザーと組織の間でメッセージングシステムを作成しようとしています。つまり、ユーザーはユーザーまたは組織からメッセージを送受信できます。 FluentとNHibernateを使用したジェネリック

だから、このシステムをサポートするために、私はインターフェイスを開始しました:

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

アイデアは後で私はメッセージよりも多くを渡すことができるようにしたいです - シリアライズされたオブジェクトのように。したがって、我々は3つのジェネリック型を持つクラスを持っています。するために、より、被写体

は、その後、私はその後、私の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 
} 

を作成し、私は渡されたアイテムをサポートするために、私のテーブルを作った:

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) 
) 

のIDの両方私のためにユーザーと組織はガイドです。今、User - Userメッセージのための私の流暢なマッピングがあります。私は4つのマッピングを作成し、ユーザーユーザー、ユーザー組織、組織ユーザー、組織組織の4つの独立したクラスを維持する必要はないと考えました。私はNhibernateがテーブル内のGUIDを受け取り、指定された型に基づいてオブジェクトを自動的に試してみることを望んでいました。

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

私は見ています問題は、私は自分のアプリケーションを実行すると、私はランタイムエラーを取得することです:

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

ので、このアプローチはも動作しますか?私は間違って何をしていますか?ありがとう!

+0

タイプを指定して参照を変更しようとしました。残念ながら、これはどちらも機能しませんでした:参考文献(x => x.From、 "FromId"); – Josh

+0

FYI - FluentNHibernateバージョン0.1.0.363およびNHibernateバージョン2.0.1.4000を使用しています – Josh

答えて

0

は、私は私の問題への解決策を見つけました。私がしたことの概要を説明する:

私はジェネリックスをダンプする必要がありました。

私は、私のインターフェイス、IPassableを持っています。

私はIPassableを実装する抽象クラスを持っている:私はPassableBaseから継承された私の「ダミー」クラスPassableItemを持って

をPassableBase。このクラスは、PassableBaseで設定されているデフォルト以外は何も行いません。

また、PassableBaseから継承するクラスです。他の渡されたオブジェクトはPassableBaseから継承する必要があります。

FluentマッピングではPassableItemが使用されます。

私のリポジトリは入力パラメータにPassableBaseを使用し、新しいPassableItemを作成するか、ストアからPassableItemを取得します(既に作成されているかどうかによって異なります)。その後、PassableItemオブジェクトに対して保存/削除を行います。

0

「From」のマッピングは何ですか&「To」のように見えますか?

NHは、マッピング情報を提供していないため、これらのエンティティをどのようにマッピングするかを考えていないと思います。

Webサービス(SOAP & REST)、メッセージキューイング、リモート(.Net)のようなテクノロジスタックを見て、ホイールを再発明していると考えて、一般に私には聞こえます。そして名前のWCF、ASMX(Webサービス)、nServiceBus、MassTransit、MSMQなどの具体的な実装で、わずか数...

Ollie第

+0

このインスタンスのFromとToは、マッピングされていて、しばらく働いていたUserProfileオブジェクトです。私はあなたが誤解していると思います。この場合の「メッセージ」は、トランスポートプロトコルではありません。これは、ユーザーが受信トレイ内のメッセージを受信する実際のメッセージングシステムであり、最終的には、ユーザーと組織がテキスト以外のものを送信できるようにシステムを拡張したいと考えています。 – Josh

関連する問題