【问题标题】:Cascade Saves with Fluent NHibernate AutoMapping使用 Fluent NHibernate AutoMapping 进行级联保存
【发布时间】:2010-10-09 20:52: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,但它似乎已经过时了。

【问题讨论】:

  • 这会使用约定来完成吗?

标签: fluent-nhibernate automapping


【解决方案1】:

这适用于新的配置位。欲了解更多信息,请参阅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();
    }
}

【讨论】:

  • 谢谢。我实际上使用了 Kristoffers 较短的示例,但我相信这个也可以使用
【解决方案2】:

更新为与当前版本一起使用:

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

【讨论】:

  • 对于“public void Apply(IOneToManyCollectionInstance instance)”,我也发现使用“instance.inverse();”很有用除了“instance.Cascade.All()”。
【解决方案3】:

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

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

转到 wiki 上的 "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 找出正确的名称。

【讨论】:

【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多