Спасение каскада с беглым автоматическим отображением NHibernate - PullRequest
21 голосов
/ 25 февраля 2009

Как «включить» каскадное сохранение с использованием модели сохраняемости AutoMap с Fluent NHibernate?

Как в:

Я спасаю человека, и рука также должна быть сохранена. В настоящее время я получаю

"объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом"

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

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

Я нашел статью на эту тему , но она, похоже, устарела.

Ответы [ 5 ]

13 голосов
/ 15 марта 2010

Обновлено для использования с текущей версией:

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();
    }
}
13 голосов
/ 20 марта 2009

Это работает с новыми битами конфигурации. Для получения дополнительной информации см. 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();
    }
}
4 голосов
/ 04 ноября 2011

Самый простой способ сделать это для всего проекта - использовать DefaultCascade :

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

Перейдите к разделу "Простейшие соглашения" в вики, для этого и списку других.

Вот список из вики:

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")

Предупреждение: некоторые имена методов в вики могут быть неверными. Я отредактировал вики то, что я мог проверить (то есть DefaultCascade и DefaultLazy), но не могу поручиться за остальное. Но вы должны быть в состоянии найти правильные имена с Intellisense, если возникнет такая необходимость.

3 голосов
/ 11 февраля 2010

Сигнатуры методов конвенции изменены. Новый ответ, который точно соответствует тому, что задает этот вопрос, см. ЭТОТ ВОПРОС .

1 голос
/ 26 февраля 2009

Вы также можете сделать каскадное соглашение по умолчанию для всех типов. Например (используя статью, на которую вы ссылаетесь, в качестве отправной точки):

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