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; }
}
Я нашел статью по этому вопросу, но, похоже, устарел.
Ответы
Ответ 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();
});