21

如何使用带有 Fluent NHibernate 的 AutoMap 持久性模型“打开”级联保存?

如:

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

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

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

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

我找到了一篇关于这个主题的文章,但它似乎已经过时了。

4

5 回答 5

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();
    }
}
于 2009-03-19T21:04:41.460 回答
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();
    }
}
于 2010-03-15T14:26:59.397 回答
4

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

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

转到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,但不能保证其余部分。但是,如果需要,您应该能够使用 Intellisense 找出正确的名称。

于 2011-11-03T22:15:09.817 回答
3

约定方法签名已更改。对于完全符合此问题要求的新答案,请参阅此问题

于 2010-02-11T17:54:47.903 回答
1

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

autoMappings.WithConvention(c =>  
  {  
    // our conventions
    c.OneToOneConvention = o => o.Cascade.All();
    c.OneToManyConvention = o => o.Cascade.All();
    c.ManyToOneConvention = o => o.Cascade.All();
  });
于 2009-02-26T17:37:58.683 回答