NHibernate映射代码(Loquacious) - 级联选项

时间:2013-01-21 12:25:03

标签: nhibernate orm nhibernate-mapping cascade

使用NHibernate Mapping By Code时,我对Cascade枚举选项行为有疑问。

Enum有以下选项:

[Flags]
public enum Cascade
{
    None = 0,
    Persist = 2,
    Refresh = 4,
    Merge = 8,
    Remove = 16,
    Detach = 32,
    ReAttach = 64,
    DeleteOrphans = 128,
    All = 256,
}

它们的目的是像位标志组合一样使用(据我所知)。

我看过NHibernate文档,并在那里定义了以下用于XML映射的级联选项:Lifecycles and object graphs

任何人都可以通过代码描述来自新Nhibernate映射的级联选项吗?其中一半是自我描述,另一半则不是。

2 个答案:

答案 0 :(得分:12)

来自src\NHibernate\Mapping\ByCode\Impl\CascadeConverter.cs

    private static IEnumerable<string> CascadeDefinitions(this Cascade source)
    {
        if (source.Has(Cascade.All))
        {
            yield return "all";
        }
        if (source.Has(Cascade.Persist))
        {
            yield return "save-update, persist";
        }
        if (source.Has(Cascade.Refresh))
        {
            yield return "refresh";
        }
        if (source.Has(Cascade.Merge))
        {
            yield return "merge";
        }
        if (source.Has(Cascade.Remove))
        {
            yield return "delete";
        }
        if (source.Has(Cascade.Detach))
        {
            yield return "evict";
        }
        if (source.Has(Cascade.ReAttach))
        {
            yield return "lock";
        }
        if (source.Has(Cascade.DeleteOrphans))
        {
            yield return "delete-orphan";
        }
    }

注意:all级联delete-orphan以外的所有内容。

答案 1 :(得分:7)

  • :没有任何级联
  • Persist = ISession.SaveOrUpdate
  • Refresh = ISession.Refresh :将对象的db状态加载到内存中并更新其属性
  • Merge = ISession.Merge :从db加载具有相同Id的对象,并使用给定实例的属性更新其属性。返回加载的对象
  • 删除= ISession.Delete :删除db中的给定实例并从会话中分离
  • 分离= ISession.Evict :从会话/更改跟踪中删除对象
  • ReAttach = ISession.Lock(LockMode.None):使用会话重新附加给定的未修改实例
  • DeleteOrphans :删除父级未引用的关联对象
  • 全部:所有obove 除了DeleteOrphans(thx to @Stefan Steinegger)