使用流畅的NHibernate AutoMapping保存级联

时间:2009-02-25 17:02:52

标签: fluent-nhibernate automapping

如何使用具有Fluent NHibernate的AutoMap Persistence Model“启用”级联保存?

如:

我救人,手臂也应该保存。目前我得到

  

“对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例”

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 个答案:

答案 0 :(得分:13)

这适用于新的配置位。有关详细信息,请参阅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();
    }
}

答案 1 :(得分:13)

已更新,可与当前版本一起使用:

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();
    }
}

答案 2 :(得分:4)

我发现在整个项目中执行此操作的最简单方法是使用 DefaultCascade

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

转到维基上的"The Simplest Conventions"部分,以及其他人的列表。

以下是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,但不能保证其余的。但是如果需要,你应该能够用Intellisense找出正确的名称。

答案 3 :(得分:3)

会议方法签名已更改。对于新答案,确切地说明了这个问题所见THIS QUESTION

答案 4 :(得分:1)

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

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