2010-05-23 55 views
0

所以我是NHibernate的新手,並且有問題。也許有人可以幫助我。 給定一個用戶級的很多很多特性:自引用表

public class User 
{ 
    public virtual Int64 Id { get; private set; } 
    public virtual string Firstname { get; set; } 
    public virtual string Lastname { get; set; } 
    public virtual string Username { get; set; } 
    public virtual string Email { get; set; } 
    ... 
    public virtual string Comment { get; set; } 
    public virtual UserInfo LastModifiedBy { get; set; } 
} 

這裏是一些DDL爲表:

CREATE TABLE USERS 
( 
    "ID" BIGINT NOT NULL , 
    "FIRSTNAME" VARCHAR(50) NOT NULL , 
    "LASTNAME" VARCHAR(50) NOT NULL , 
    "USERNAME" VARCHAR(128) NOT NULL , 
    "EMAIL" VARCHAR(128) NOT NULL , 
    ... 
    "LASTMODIFIEDBY" BIGINT NOT NULL , 
) IN "USERSPACE1" ; 

數據庫表字段「LASTMODIFIEDBY」從用戶持有的審計目的的Id誰插入或更新的情況下行事。這通常是一個管理員。 因爲用戶界面不會顯示這個Int64而是管理員名稱(類似'姓氏,名字'),我需要通過自我引用表USERS來檢索這些值。接下來是,一個類型的用戶的整個對象將被不必要的字段數量矯枉過正。因此,有一個UserInfo類具有更小的佔用空間。

public class UserInfo 
{ 
    public Int64 Id { get; set; } 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public string FullnameReverse 
    { 
     get { return string.Format("{0}, {1}", Lastname ?? string.Empty, Firstname ?? string.Empty); } 
    } 
} 

所以這裏就開始了這個問題。其實我不知道如何完成這個任務。我不知道我是否也必須提供類UserInfo的映射,而不僅僅是類User。我想將UserInfo作爲Composite-element集成到User-class的映射中。但我不知道如何定義USERS.ID和USERS.LASTMODIFIEDBY表字段之間的映射。 希望我可以清楚地描述我的問題,以獲得一些提示。非常感謝!

回答

1

這看起來很糟糕或過早的優化。

如果您將LastModifiedBy定義爲User並使用<many-to-one>來映射它,那麼您是否真的有任何性能問題?

這應該是你的出發點。

+0

謝謝你的迴應。但是,我真的需要檢索幾十個不需要的和不需要的字段及其內容,只能獲取「姓氏+」,「+名字」。 在SQL中,我會寫'select a.id,a.username,...,b.firstname + || ','+ b.lastname from a a join a users b on a.lastmodified = b.id'。 我很高興使用NH,但這樣一個簡單的任務讓我頭痛。哎呀。 如果我找不到解決方案,我將使用User-Class而不是UserInfo。但儘管你稱之爲過早,但我無法看到使用大型用戶對象與裁剪小對象的優勢。 – mue 2010-05-23 18:30:55

+0

考慮到我們談論的是單條記錄,選擇網絡延遲時間可能大於行傳輸時間的地方,並且NH允許對實體進行兩級緩存,但我認爲除了頭痛之外,您還不會得到什麼試圖對其進行微觀管理。 – 2010-05-23 18:55:25