繁体   English   中英

Nhibernate映射列表 <Class> Class有自己的表

[英]Nhibernate mapping List<Class> where Class has its own table

我正在尝试为类创建映射:

public class Employer
    {
        public virtual int Id { get; protected set; }
        public virtual string Name { get; set; }
        public virtual IList<Field> Fields { get; set; }
        public virtual string Location { get; set; }
        public virtual string Phone { get; set; }
    }

public class Field
    {
        public virtual int Id { get; protected set; }
        public virtual string Description { get; set; } 
    }

我的映射如下:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="lab" assembly="lab">

  <class name="Employer" table="Employer">
    <id name="Id">
      <generator class="native"/>
    </id>
    <property name="Name" />

    <list name="Fields" cascade="all-delete-orphan">
      <key column="EmployerId" />
      <index column="FieldIndex" />
      <one-to-many class="Field"/>
    </list>

    <property name="Location" />
    <property name="Phone" />
  </class>

</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="lab" assembly="lab">

  <class name="Field" table="Field">
    <id name="Id">
      <generator class="native"/>
    </id>
    <property name="Description" />
  </class>

</hibernate-mapping>

代码看起来像:

var session = configuration.BuildSessionFactory().OpenSession();
var transaction = session.BeginTransaction();
var emp = new Employer();
emp.Name = "Mera";
emp.Fields = new List<Field> ();
emp.Fields.Add(new Field() { Description = "C#" });
emp.Fields.Add(new Field() { Description = "C++" });
emp.Location = "Street";
emp.Phone = "02";
session.Save(emp);
transaction.Commit();

var transaction2 = session.BeginTransaction();
var emp2 = new Employer();
emp2.Name = "Mera2";
emp2.Fields = session.CreateQuery("from Field").List<Field>();
emp2.Location = "Street";
emp2.Phone = "02";
session.Save(emp2);
transaction2.Commit();

此代码仅将字段表中的旧条目替换为第二个雇主的新条目。 因此,“字段”表仍具有2条记录,而“雇主”表具有2条记录。

如您所了解的,我需要如果两个字段相等(相同的描述),则两个雇主都应在其上具有相同的对象引用。

正如JamesB在他的评论中所说,这看起来像是多对多关系。 多对多关系需要一个中间表,否则您将获得所见的行为。

为了获得所需的行为,您将需要创建一个名为EmployerFields类的新表。 该表将需要有两个外键字段,一个用于Employer ,另一个用于Fields ,以及一个用于索引的字段FieldIndex FK可以分别称为EmployerIdFieldId

然后,将需要更改列表映射,如下所示。

<list name="Fields" cascade="all-delete-orphan" table="EmployerFields">
  <key column="EmployerId" />
  <index column="FieldIndex" />
  <many-to-many class="Field" column="FieldId" />
</list>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM