У меня есть приложение для обычного телефона, использующее Fluent NHibernate 1.1. В приложении объект "Человек" имеет много объектов "PhoneNumber". Я пытаюсь удалить Личность, и я хочу, чтобы каскадировать удаления в PhoneNumbers. Я установил соглашение DefaultCascade.All()
после прочтения этого ответа. Однако попытка удалить родительский объект по-прежнему вызывает исключение - кажется, что NHibernate пытается обновить дочернюю таблицу, чтобы установить родительский идентификатор в значение null, а не просто удалить запись:
{ "не удалось удалить коллекцию: [Person.PhoneNumbers # 473] [SQL: UPDATE phone_numbers SET person_id = null WHERE person_id = @p0]" }
InnerException:
{ "Невозможно вставить значение NULL в столбец" person_id ", table" directory.dbo.phone_numbers ", столбец не допускает нулей. Ошибка UPDATE.\r\nПриложение завершено." }
My Fluent config:
public static ISessionFactory CreateSessionFactory() {
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["activeConnStr"]].ConnectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()
.Conventions.Add(DefaultCascade.All())
)
.BuildSessionFactory();
}
Родительский класс:
public class Person {
public Person() {
PhoneNumbers = new List<PhoneNumber>();
EmailAddresses = new List<string>();
}
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Company { get; set; }
public virtual IList<PhoneNumber> PhoneNumbers { get; set; }
public virtual IList<string> EmailAddresses { get; set; }
}
Класс child (PhoneNumber):
public class PhoneNumber {
public virtual string Number { get; set; }
public virtual PhoneNumberType NumberType { get; set; }
public virtual Person Person { get; set; }
}
Мой код для удаления человека:
public static void DeletePerson(int id) {
using (var session = Dalc.Instance.SessionFactory.OpenSession()) {
using (var trans = session.BeginTransaction()) {
session.Delete(session.Load<Person>(id));
trans.Commit();
}
}
}
Что я делаю неправильно?