代码之家  ›  专栏  ›  技术社区  ›  rmontgomery429

使用流畅的NHibernate自动应用进行级联保存

  •  21
  • rmontgomery429  · 技术社区  · 17 年前

    如何使用带有fluent nhibernate的automap持久性模型“打开”级联保存?

    如:

    我救了那个人,胳膊也应该救。目前我得到

    “对象引用未保存的临时实例-刷新前保存临时实例”

    public class Person : DomainEntity
    {
      public virtual Arm LeftArm { get; set; }
    }
    
    public class Arm : DomainEntity
    {
      public virtual int Size { get; set; }
    }
    

    我发现 an article on this topic 但似乎已经过时了。

    5 回复  |  直到 12 年前
        1
  •  13
  •   Martin Atkins    12 年前

    这适用于新的配置位。有关详细信息,请参阅 http://fluentnhibernate.wikia.com/wiki/Converting_to_new_style_conventions

    //hanging off of AutoPersistenceModel    
    .ConventionDiscovery.AddFromAssemblyOf<CascadeAll>()
    
    
    public class CascadeAll : IHasOneConvention, IHasManyConvention, IReferenceConvention
    {
        public bool Accept( IOneToOnePart target )
        {
            return true;
        }
    
        public void Apply( IOneToOnePart target )
        {
            target.Cascade.All();
        }
    
        public bool Accept( IOneToManyPart target )
        {
            return true;
        }
    
        public void Apply( IOneToManyPart target )
        {
            target.Cascade.All();
        }
    
        public bool Accept( IManyToOnePart target )
        {
            return true;
        }
    
        public void Apply( IManyToOnePart target )
        {
            target.Cascade.All();
        }
    }
    
        2
  •  13
  •   Kristoffer    16 年前

    更新后可用于当前版本:

    public class CascadeAll : IHasOneConvention, IHasManyConvention, IReferenceConvention
    {
        public void Apply(IOneToOneInstance instance)
        {
            instance.Cascade.All();
        }
    
        public void Apply(IOneToManyCollectionInstance instance)
        {
            instance.Cascade.All();
        }
    
        public void Apply(IManyToOneInstance instance)
        {
            instance.Cascade.All();
        }
    }
    
        3
  •  4
  •   RedGreenCode    12 年前

    对于整个项目,我发现最简单的方法是使用 缺省级联 :

    .Conventions.Add( DefaultCascade.All() );     
    

    "The Simplest Conventions" wiki上的部分,用于此,以及其他列表。

    这是wiki上的列表:

    Table.Is(x => x.EntityType.Name + "Table")
    PrimaryKey.Name.Is(x => "ID")
    AutoImport.Never()
    DefaultAccess.Field()
    DefaultCascade.All()
    DefaultLazy.Always()
    DynamicInsert.AlwaysTrue()
    DynamicUpdate.AlwaysTrue()
    OptimisticLock.Is(x => x.Dirty())
    Cache.Is(x => x.AsReadOnly())
    ForeignKey.EndsWith("ID")
    

    一个警告词-wiki中的一些方法名称可能是错误的。我用我能验证的东西(如defaultcascade和defaultlazy)编辑了wiki,但不能为其他人担保。但是,如果需要的话,你应该能够用智能感知找出合适的名字。

        4
  •  3
  •   Community Mohan Dere    9 年前

    约定方法签名已更改。关于这个问题的新答案,请看 THIS QUESTION .

        5
  •  1
  •   Oenotria    17 年前

    还可以使级联成为所有类型的默认约定。例如(以链接到的文章为起点):

    autoMappings.WithConvention(c =>  
      {  
        // our conventions
        c.OneToOneConvention = o => o.Cascade.All();
        c.OneToManyConvention = o => o.Cascade.All();
        c.ManyToOneConvention = o => o.Cascade.All();
      });
    
    推荐文章