Подтвердить что ты не робот

Cascade сохраняет с помощью бесплатной NHibernate AutoMapping

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

Как в:

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

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

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

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

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

4b9b3361

Ответ 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();
    }
}

Ответ 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();
    }
}

Ответ 3

Самый простой способ, который я нашел для всего проекта, - использовать 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 могут быть неправильными. Я редактировал Wiki с помощью того, что я мог проверить (то есть DefaultCascade и DefaultLazy), но не может ручаться для остальных. Но вы должны уметь определять имена с Intellisense, если возникнет такая необходимость.

Ответ 4

Подписи подходов к Конвенции изменились. Для нового ответа, который делает именно этот вопрос, смотрите ЭТО ВОПРОС.

Ответ 5

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

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