2010-01-02 149 views
1

我一直在努力研究如何完成我的任務,實際上我甚至不確定我要進入的方向確實是一個不好的方面我的SQL表 - 但它是我能夠想到的最簡潔的。NHibernate映射 - 如何實現這個

我的問題描述起來相當簡單。我有一個包含註釋的表,其中有一個外鍵用於我的用戶表(表示評論的作者)。爲了正確支持匿名用戶,我決定讓這個外鍵可以爲空 - 我還提供了3列用於指定姓名,電子郵件和網站,我希望在用戶匿名的情況下存儲相關信息 - 這些字段也是空。

因此,在短期

  • 如果用戶登錄,外鍵將包含用戶名的ID,電子郵件地址和網站將爲空。
  • 如果用戶未登錄,則外鍵將爲空,名稱,電子郵件和網站將包含有關用戶的數據。

在我的域模型中,我希望將其映射到User類(屬性Author,在我的評論類)。這個User類有一個名爲「IsAnonymous」的屬性 - 應該相應地設置它。

理想情況下,我會設置一些映射設置,根據外鍵的值映射此Author屬性並正確指定這些屬性。我已經有一個映射到我的用戶類映射到用戶表,但我不知道我會如何做到另一種方式。

我已經試過調查IUserType接口,但我不能完全理解我會如何在這個問題上不得不從2個不同的表中讀取。

有沒有一種合理的方式來做到這一點使用我當前的數據庫結構 - 或者我應該考慮切換我的佈局,如果是這樣,到什麼?

我從我的用戶表中有一個簡單的列切換指示一個匿名用戶,但是當名稱列設置爲唯一鍵時,這開始給我提出問題。我希望註冊用戶擁有唯一的名稱,但不是匿名用戶。

謝謝你的時間。

編輯:閱讀了這一點,決定也許一些ASCII /僞SQL圖會派上用場

User 
----- 
UserId Guid PRIMARY KEY 
Name nvarchar(200) UNIQUE KEY NOT NULL 
Email nvarchar(200) NOT NULL 
Website nvarchar(200) NOT NULL 

Comment 
------- 
CommentId Guid PRIMARY KEY 
UserId GUID - FK-USER 
Name nvarchar(200) 
Email nvarchar(200) 
Website nvarchar(200) 

回答

1

我有類似的東西

//map this in NH 
public virtual User LoggedInCreator {get;set;} 
//Not mapped 
public virtual User CreatorInformation { 
    get { 
     if(LoggedInCreator != null) return LoggedInCreator; 
     return new User { 
       Name = AnonymousCommenterName, 
       Email = AnonymousCommenterEmail, 
       Website= AnonymousCommenterWebsite 
      }; 
    } 
} 
public void SetAnonymouscommenter(string name, string email, string website) 
{ 
    LoggedInCreator = null; 
    AnonymousCommenterName = name; 
    AnonymousCommenterEmail = email; 
    AnonymousCommenterWebsite = website; 
} 

但是,如果你想在更乾淨的方式,你會使用NHibernate的一個偉大的功能,它可以映射字段並映射屬性,它們的值存儲在字段中。
這裏是一個更清潔的實現會是什麼:

protected User _commenter; 
public virtual User Commenter 
{ 
    get { 
     if(_commenter != null) return _commenter; 
     return new User { 
       Name = AnonymousCommenterName, 
       Email = AnonymousCommenterEmail, 
       Website= AnonymousCommenterWebsite 
     }; 
    } 
    set { 
     bool isAnonymous = value.Id == 0; 
     _commenter = isAnonymous ? null : value; 
     AnonymousCommenterName = isAnonymous ? value.Name : null; 
     AnonymousCommenterEmail = isAnonymous ? value.Email : null; 
     AnonymousCommenterWebsite = isAnonymous ? value.Website : null; 
    } 
} 

你可以看到它們在本質雖然同樣的想法,只是一些清理使用NHibernate特點。

+0

這可以工作!我目前正在研究一種方法,將我的評論類繼承到我的NHibernate特定用例中,並僅在我的NHibernate代碼中使用它。一旦我完成測試,看看它是否可以工作,我會返回。 – kastermester 2010-01-02 22:16:15

+0

謝謝你,你的建議讓我以一種似乎有效的方式行事。在NH層中實現它有點代碼,但另一方面,它使得它可以在其他地方工作,並且以我頭腦中有意義的方式存儲在數據庫中:) – kastermester 2010-01-03 01:48:43