流畅的NHibernate级联删除无法正常工作
我有一个使用Fluent NHibernate 1.1的简单手机目录应用程序。 在应用程序中,“Person”对象有许多“PhoneNumber”对象。 我正在尝试删除一个人,我想将删除级联到PhoneNumbers。 我在阅读完这个答案后设置了DefaultCascade.All()
的约定。 但是,尝试删除父对象仍会引发exception – 似乎NHibernate正在尝试更新子表以将父ID设置为null而不是仅删除记录:
{“无法删除集合:[Person.PhoneNumbers#473] [SQL:UPDATE phone_numbers SET person_id = null WHERE person_id = @ p0]”}
的InnerException:
{“无法将值NULL插入列’person_id’,表’directory.dbo.phone_numbers’;列不允许空值.UPDATE失败。\ 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() .Conventions.Add(DefaultCascade.All()) ) .BuildSessionFactory(); }
父类是:
public class Person { public Person() { PhoneNumbers = new List(); EmailAddresses = new List(); } 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 PhoneNumbers { get; set; } public virtual IList 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(id)); trans.Commit(); } } }
我究竟做错了什么?
我不确定配置Fluent部分,但我最近遇到了与ActiveRecord相同的问题。
您需要在Person端设置您的关联为Inverse = true
。
从查看“ 入门”文档…
我相信,你需要在Person中定义你的HasMany关系时设置它。 它应该看起来像这样:
public PersonMap() { //<...SNIP...> HasMany(x => x.PhoneNumbers) .Inverse(); //<...SNIP...> }
有用; 以下是每个级联选项的含义:
none – 不做任何级联,让用户自己处理它们。
save-update – 保存/更新对象时,检查关联并保存/更新任何需要它的对象(包括在多对多方案中保存/更新关联)。
delete – 删除对象时,删除关联中的所有对象。
delete-orphan – 删除对象时,删除关联中的所有对象。 除此之外,当从关联中删除对象而不与另一个对象(孤立对象)关联时,也要删除它。
all – 当对象保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。
all-delete-orphan – 当一个对象被保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。 除此之外,当从关联中删除对象而不与另一个对象(孤立对象)关联时,也删除它。
public class PersonMap : ClassMap { public PersonMap() { Table("Person"); Id(x => x.Id); Map(x => x.Name); HasMany(x => x.PhoneNumberList) .KeyColumn("PersonId") .Cascade.All() .Inverse().LazyLoad(); } }