我有一个看起来像这样的架构
用户
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将两个信息值保存到信息值表?
答案 0 :(得分: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
-----可能不需要的建议-----
其次,如果我可以大胆提供一些建议,请不要这样做。我指的是你的表结构。如果我的假设是错误的,请随意忽略我的建议。
我假设您希望将用户信息放在一个额外的表中,以避免在需要新属性时修改表结构。如果这就是原因,我可以诚实地告诉你,根据我自己的经验,这将导致很多头痛。除了查询表时的性能问题,其他一切也会变得复杂得多。插入值的例子不言而喻。搜索这些属性的任何查询都会一样糟糕。如果你想保存除了弦乐之类的东西,你会怎么做?转换为int,DateTime,bool等?
我可以在这里继续,但除非你以后绝对不能改变表结构,否则请不要追求这个想法。