У меня есть отношения «один к одному» между классом Person и Employee. Я ожидаю, что INSERT будет каскадом от Человека к Работнику. Однако этого не происходит. Я пробовал cascade = 'all' и cascade = 'save-update' для элемента отношения один к одному, но это не сработало.NHibernate - индивидуальные настройки каскада
Структуры моих объектов заключаются в следующем:
public class Person
{
public virtual Employee Employee { get; set; }
public virtual int Age { get; set; }
public virtual string Forename { get; set; }
public virtual string Surname { get; set; }
public virtual int PersonID { get; set; }
}
public class Employee
{
public virtual int PersonID { get; set; }
public virtual string PayRollNo { get; set; }
public virtual int Holidays { get; set; }
public virtual Person Person { get; set; }
}
Отображение файлов показано ниже:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Employee, Employee.DAL" table="`Employee`" >
<id name="PersonID" column="`PersonId`" type="int">
<generator class="native" />
</id>
<property type="string" length="30" name="PayRollNo" column="`PayRollNo`" />
<property type="int" name="Holidays" column="`Holidays`" />
<one-to-one name="Person" class="Person" cascade="all"/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Person, Employee.DAL" table="`Person`" >
<id name="PersonID" column="`PersonId`">
<generator class="foreign">
<param name="property" >Employee</param>
</generator>
</id>
<property type="string" name="Forename" column="`Forename`" />
<property type="string" name="Surname" column="`Surname`" />
<property type="int" name="Age" column="`Age`" />
<one-to-one name="Employee" class="Employee" constrained="true" />
</class>
</hibernate-mapping>
код для инициализации объектов и сохранения их:
var employee = new Employee();
employee.Person = new Person { Employee = employee };
ISessionFactory sessionFactory = (new Configuration()).Configure().BuildSessionFactory();
employee.Person.Age = 27;
employee.Person.Forename = "N";
employee.Person.Surname = "M";
employee.PayRollNo = "12";
employee.Holidays = 27;
using (var session = sessionFactory.OpenSession())
{
session.Save(employee);
}
Я применил свое предложение и до сих пор он не работает, я загрузил исходный образец код bit.ly/gNlAWr мне было интересно, если у вас есть время чтобы быстро взглянуть на нее. –
@Nima, 'contrained' атрибут находится на сопоставлении Employee, но он должен находиться на сопоставлении Person. Также кажется, что ваша проверка внешнего ключа также должна быть в таблице Employee, а не в таблице Person. – Vadim
Спасибо Ядс. Что вы подразумеваете под контролем внешнего ключа? –