2011-03-18 289 views
0

我有一個模式,它看起來像這樣數據保存到表沒有主鍵

用戶

Id INT 
Username VARCHAR(100) 
Password VARCHAR(100) 

User_Info_Key

Id INT 
Description VARCHAR(100) 

USER_INFO

User INT 
Info_Key INT 
Info_Value VARCHAR(100) 
PRIMARY KEY(User, Info_Key) 

這裏是我的用戶映射文件:

<class name="User" table="[user]"> 
    <id name="Id"> 
    <column name="id" /> 
    <generator class="native" /> 
    </id> 
    <property name="Username" /> 
    <property name="Password" /> 
    <bag name="InfoValues" cascade="all" lazy="false"> 
    <key column="[user]" /> 
    <one-to-many class="FMInfoValue" /> 
    </bag> 
</class> 

<class name="InfoKey" table="[user_info_key]"> 
    <id name="Id"> 
    <column name="id" /> 
    <generator class="native" /> 
    </id> 
    <property name="Description" /> 
</class> 

<class name="InfoValue" table="[user_info]"> 
    <composite-id> 
    <key-property name="User" column="[user]" type="int"></key-property> 
    <key-property name="Key" column="[info_key]" type="int"></key-property> 
    </composite-id> 
    <property name="Value" column="[info_value]" /> 
    <many-to-one name="FMInfoKey" class="FMInfoKey" 
      column="[info_key]" 
      cascade="all" 
      lazy="false" /> 
</class> 

當我創建一個新的用戶我這樣做:

User newuser = new User(); 
newuser.Username = this.Username; 
newuser.Password = this.Password; 
session.Save(newuser); 

而且這樣節省的基本信息。

但是當我嘗試添加的第一個名字(信息鍵值1)和姓(信息鍵值2)沒有被保存到數據庫:

InfoValue userfname = new InfoValue(); 
InfoKey userfnamekey = new InfoKey(); 
userfnamekey.Id = 1; 
userfname.InfoKey = userfnamekey; 
userfname.Key = 1; 
userfname.User = (int) newuser.Id; 
userfname.Value = this.Firstname; 
session.Save(userfname); 

InfoValue userlname = new InfoValue(); 
InfoKey userlnamekey = new InfoKey(); 
userlnamekey.Id = 2; 
userlname.InfoKey = userlnamekey; 
userlname.User = (int)newuser.Id; 
userlname.Value = this.Lastname; 
session.Save(userlname); 

如何讓NHibernate的保存信息值表中有兩個信息值?

+1

如果您發佈代碼,XML或數據樣本,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地設置格式和語法突出顯示它! – 2011-03-18 23:02:29

回答

2

首先,我想你想要做的是在你的InfoValue類中有兩個多對一的屬性。這將是這樣的:

class InfoValue 
{ 
    public virtual User User { get; set; } 
    public virtual InfoKey Key { get; set; } 
    public virtual String Value { get; set; } 
} 

你的映射會是這個樣子:

<class name="InfoValue" table="[user_info]"> 
    <composite-id> 
    <key-many-to-one name="User" column="[user]" lazy="proxy" class="User" /> 
    <key-many-to-one name="Key" column="[info_key]" lazy="proxy" class="InfoKey" /> 
    </composite-id> 
    <property name="Value" column="[info_value]" /> 
</class> 

來自實例在這裏拍攝和適應:Composite-id with many-to-one

-----可能不需要的建議 - ----

二,如果我可能如此大膽地提供一些建議,不要這樣做。我指的是你的表格結構。如果我的假設是錯誤的,請隨時忽略我的建議。

我假設你想把用戶信息放在一個額外的表中,以避免在需要新屬性時不得不修改表結構。如果這是原因,我可以誠實地告訴你,從我的經驗來看,這會導致很多頭痛。查詢表格時除了性能問題外,其他所有內容也會更加複雜。你的插入值的例子說明了一切。任何你搜索這些屬性的查詢都會很糟糕。如果你想保存除Strings之外的任何內容,你會怎麼做?投射到int,DateTime,bool等?

我可以繼續前進,但除非你以後絕對不能改變表格結構,否則請不要追求這個想法。