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

Cor*_*ndt 11 nhibernate orm cascade nhibernate-mapping

当使用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,
}
Run Code Online (Sandbox Code Playgroud)

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

我通过NHibernate文档查看过,并在那里定义了以下用于XML映射的级联选项:生命周期和对象图

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

Ste*_*ger 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";
        }
    }
Run Code Online (Sandbox Code Playgroud)

注意:all除了delete-orphan.之外的所有级联.


Fir*_*iro 7

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