【发布时间】:2011-04-30 09:28:23
【问题描述】:
我有一个使用 Fluent NHibernate 1.1 的简单电话目录应用程序。在应用程序中,“Person”对象有许多“PhoneNumber”对象。我正在尝试删除一个人,我想将删除级联到电话号码。在阅读this answer 后,我设置了DefaultCascade.All() 的约定。但是,尝试删除父对象仍然会引发异常——似乎 NHibernate 正在尝试更新子表以将父 ID 设置为空,而不是仅仅删除记录:
{"无法删除集合:[Person.PhoneNumbers#473][SQL: UPDATE phone_numbers SET person_id = null WHERE person_id = @p0]"}
内部异常:
{"无法将值 NULL 插入列 'person_id',表 'directory.dbo.phone_numbers';列不允许空值。更新失败。\r\n语句已终止。"}
我的 Fluent 配置是:
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; }
}
子类(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();
}
}
}
我做错了什么?
【问题讨论】:
标签: c# fluent-nhibernate