Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 不使用主键将数据保存到表中_Nhibernate - Fatal编程技术网

Nhibernate 不使用主键将数据保存到表中

Nhibernate 不使用主键将数据保存到表中,nhibernate,Nhibernate,我有一个这样的模式 使用者 用户信息密钥 Id INT Description VARCHAR(100) 用户信息 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" /> <g

我有一个这样的模式

使用者

用户信息密钥

Id INT
Description VARCHAR(100)
用户信息

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>
这将保存基本信息

但当我尝试添加名字(信息键值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将这两个信息值保存到info value表中?

首先,我认为您要做的是在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>
您的映射将如下所示:

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>

从这里选取并改编的示例:

-----可能是不想要的建议-----

第二,如果我可以大胆地提出一些建议,请不要这样做。我指的是你们的桌子结构。如果我的假设是错误的,请不要理会我的建议

我假设您希望将用户信息放在一个额外的表中,以避免在需要新属性时不得不修改表结构。如果这是原因,我可以诚实地告诉你,从我自己的经验,这将导致很多头痛。除了查询表时的性能问题之外,其他一切都将变得更加复杂。您插入值的示例说明了这一点。搜索这些属性的任何查询都同样糟糕。如果您不想保存字符串,您会怎么做?转换为int、DateTime、bool等


我可以在这里继续讲下去,但是除非你以后绝对不能改变表的结构,否则请不要继续这个想法

如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以很好地格式化和语法突出显示它!