2009-08-19 71 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類泛型的類。收件人,發件人,對象

然後我創建了消息類

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對我的兩個用戶和組織是guid。現在,我有了用戶 - 用戶消息的流暢映射。我的想法是,我只需要創建4個映射,而不是爲用戶用戶,用戶組織,org用戶和org-org維護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 2009-08-19 22:20:07

+0

僅供參考 - 我們使用的是FluentNHibernate版本0.1.0.363和NHibernate版本2.0.1.4000 – Josh 2009-08-19 22:25:07

回答

0

我找到了解決我的問題。給我一個粗略的概述:

我不得不轉儲泛型。

我有我的界面IPassable。

我有一個實現IPassable一個抽象類:PassableBase

我有一個從PassableBase繼承我的「虛擬」類PassableItem。此類除了在PassableBase中設置的默認值之外不做任何事情。

消息是也繼承自PassableBase的類。其他傳遞的對象將不得不從PassableBase繼承。

我的流利映射使用PassableItem。

我的存儲庫使用PassableBase作爲輸入參數,我創建一個新的PassableItem或從存儲中獲取一個PassableItem(取決於它是否已經創建),然後對PassableItem對象執行保存/刪除操作。

0

那麼'從''&'到'看起來像什麼?

因爲我覺得NH並沒有如何映射這些實體,因爲你沒有提供映射信息。

總的來說,聽起來你認爲你在重新發明輪子,你是否看過像Web服務(SOAP & REST),消息隊列,遠程處理(.Net)的技術堆棧。而像WCF,ASMX(Web服務),nServiceBus,MassTransit,MSMQ具體實現,僅舉幾...

奧利

+0

From和To在這個實例中是UserProfile對象,它們被映射並且已經工作了一段時間。我認爲你誤解了。這種情況下的「消息」不是傳輸協議。它是一個實際的消息系統,用戶可以在收件箱中收到消息,最終我希望能夠擴展系統以允許用戶和組織發送的不僅僅是文本。 – Josh 2009-08-20 13:15:24