[英]Fluent NHibernate cascade delete not working
我有一個使用Fluent NHibernate 1.1的簡單手機目錄應用程序。 在應用程序中,“Person”對象具有許多“PhoneNumber”對象。 我正在嘗試刪除一個人,我想將刪除級聯到PhoneNumbers。 我在閱讀完這個答案后設置了DefaultCascade.All()
的約定。 但是,嘗試刪除父對象仍會引發異常 - 似乎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<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();
}
}
}
我究竟做錯了什么?
我不確定配置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<Person>
{
public PersonMap()
{
Table("Person");
Id(x => x.Id);
Map(x => x.Name);
HasMany<PhoneNumber>(x => x.PhoneNumberList)
.KeyColumn("PersonId")
.Cascade.All()
.Inverse().LazyLoad();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.