Vik*_*ram 6 nhibernate many-to-many one-to-one one-to-many
我有以下两个类:
public class Project
{
public virtual int ProjectId { get; set; }
public virtual string ProjectName { get; set; }
public virtual LegalEntity LegalEntity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
public class LegalEntity
{
public virtual int LegalEntId { get; set; }
public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
映射为:
<class name="Project" table="Project" dynamic-update="true">
<id name="ProjectId">
<generator class="native"/>
</id>
<property name="ProjectName" />
<many-to-one name="LegalEntity" column="LegalEntId" fetch="join" cascade="all-delete-orphan" />
</class>
Run Code Online (Sandbox Code Playgroud)
和
<class name="LegalEntity" table="LegalEnt" dynamic-update="true">
<id name="LegalEntId">
<generator class="native"/>
</id>
<property name="Name" />
</class>
Run Code Online (Sandbox Code Playgroud)
在数据库中,Project表有一个FK到LegalEntity的PK列.一个项目只有一个法人实体.不同的项目可以有相同的法律实体.这就是我多对一的原因.不确定这是否正确.
插入和更新工作正常.但是,如果我更新项目中的法人实体ID并且该法律实体变为孤儿,我希望将其删除.但它没有发生.我在理解delete-all-orphan时错了吗?如果是,我该如何实现这种行为?
Rad*_*ler 10
该many-to-one级联不支持all-delete-orphan,请参阅:
Run Code Online (Sandbox Code Playgroud)<many-to-one ... cascade="all|none|save-update|delete" (4) ...
此外,NHibernate的会话几乎不可能处理这个功能.因为它不必清楚,所引用many-to-one的实际上是孤儿.在DB中应该有一些更远的检查...可能有其他地方引用这个表行...
建议:在您的代码中将其作为DAO或Business Facade实现的一部分.检查是否确实没有依赖项,然后发出明确的Delete()
EXTEND:这是QueryOver获取所有"孤儿" LegalEntity 列表的语法
// subquery
var subquery = QueryOver.Of<Project>()
.Select(x => x.LegalEntity.LegalEntId);
// just these legal entities, which are NOT used
var query = session.QueryOver<LegalEntity>()
.WithSubquery
.WhereProperty(y => y.LegalEntId)
.NotIn(subquery)
;
// orphans
var list = query
.List<LegalEntity>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5542 次 |
| 最近记录: |