如何使用具有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,但似乎已过时。
答案 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();
});