让我与显示映射开始:NHibernate的级联删除
家长:
<bag name="Communicatiekanalen" table="COMMUNICATIEKANAAL" inverse="true" cascade="delete" lazy="true" >
<key column="SEK_PROFIEL"/>
<one-to-many class="Crm.Hibernate.Communicatiekanaal,Crm.Hibernate" />
</bag>
儿童:
<many-to-one name="SekProfiel" column="SEK_PROFIEL" class="Crm.Hibernate.Profiel,Crm.Hibernate" />
换句话说:一个配置文件可以有多个通信通道。
在UI(用户界面[ASP.NET Web表单])以下事件被触发 (删除与通信信道的简档连接到它):
var profielDao = CrmConfiguration.GetDaoFactory().GetProfielDao();
var profiel = profielDao.GetById(2194, true); //lets say '2194' is an ID that exists
profielDao.Delete(profiel);
(该DaoFactory位于在一个项目文件中,UI是一个ASP.NET网站)
此代码有效。
重要提示:代码使用的是NHibernate的'open-session-in-view'模式。
我有一个服务实现,触发相同的代码(删除通信通道配置文件)。一些代码...
var daof = CrmConfiguration.GetDaoFactory();
CrmSettings.Instance.UserID = user;
var profielDao = daof.GetProfielDao();
profielDao.BeginTransaction();
var profiel = profielDao.GetById(CrmEntitiesToHibernate.ParseStringToId(profileId), true);
profielDao.Delete(profiel);
profielDao.EndTransaction();
Where'EndTransaction()'做'commit'。我用“单元测试”测试该代码:
[TestMethod]
public void TestDeleteProfile()
{
//Getting a valid NEW profile
var profile = GetSecundaryProfile();
//Adding a communication channel to the profile
CrmClient.AddCommunicationChannelForProfile(GetPlainCommunicationChannel(), profile.Id, CurrentUserId);
//Calling the 'delete profile' method on the service --> FAIL - no cascade
CrmClient.DeleteProfile(profile.Id, CurrentUserId);
}
此代码失败。以下错误令我烦恼:
DELETE语句与参考约束“R2_PROFIEL”的 冲突。 冲突发生在数据库 “CRM_ontw”,表 “dbo.COMMUNICATIEKANAAL”,列 'SEK_PROFIEL'。该声明已被终止 。
这意味着级联根本没有发生。从UI它工作执行,而是从“服务实现”发射时,它失败。任何想法或建议可以帮助我?
在此先感谢
编辑:以下通用的代码删除的对象
public void Delete(T entity)
{
try
{
OnDelete(entity);
}
catch (Exception)
{
SessionManager.Instance.RollbackTransactionOn(SessionFactoryConfigPath);
throw;
}
session.Delete(entity);
}
设置all-delete-orphan
不能解决问题。
什么'profielDao.Delete(profiel)'执行? – 2011-02-28 18:47:08