Каскад удаляет косвенно связанные объекты с помощью NHibernate - PullRequest
0 голосов
/ 14 июля 2009

В дополнение к моему другому вопросу , учитывая следующие классы и беглую карту, есть ли способ автоматического каскадного удаления DriversLicense при удалении связанного лица? Обратите внимание, я не хочу, чтобы класс Person имел какие-либо знания о классе DriversLicense, но я также не хочу потерять осиротевшие данные, если Person будет удален.

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class DriversLicense
{
        public virtual Person Person { get; set; }
        public virtual string State { get; set; }

        public override bool Equals( object obj ){ ... }
        public override int GetHashCode(){ ... }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
        public DriversLicenseMap()
        {
                UseCompositeId().WithKeyReference( x => x.Person );
                Map( x => x.State );
        }
}

Ответы [ 2 ]

0 голосов
/ 18 июля 2009

Поскольку вы не можете каскадно удалять из DriversLicense для Person по деловым причинам, и вы действительно не знаете, что лицо знает о DriversLicense, и у вас есть действительно У меня есть веские основания для этого требования, поэтому я думаю, что вы можете справиться с ним одним из двух способов:

  1. Перенесите ответственность за удаление объекта DriversLicense в ваши уровни обслуживания или хранилища и выполните то, что предложил Крис. Запросите объект PersonLicnese объекта Person и удалите его перед удалением объекта Person.

  2. Вы можете создать Nhibernate Interceptor или EventHandler, который выполняет удаление для вас. Этот подход делает ваши репозитории и домен красивыми и чистыми и, вероятно, я бы выбрал этот подход, если бы не мог ссылаться на коллекцию DriveLicenese из моего объекта person. ( Документация по событиям NHibernate )

0 голосов
/ 14 июля 2009

Вы не можете сделать это так, как вы хотите структурировать свои объекты. Если вы хотите добавить DriversLicense в класс Person, вы можете каскадно удалить его. Но, как вы уже сказали, вы не хотите, чтобы объект person имел какие-либо знания о DriversLicense.

Что вам действительно нужно сделать, так это получить все водительские права, которые содержат этого человека, а затем удалить DriverLicenses с Cascade delete, и это удалит личную запись и лицензию.

(Я не следил за многими изменениями в стеке FNH в последнее время, поэтому возможно, что он был переименован в какой-то момент) Вам нужно изменить свою карту на что-то похожее на:

public DriversLicenseMap()
{
        UseCompositeId().WithKeyReference( x => x.Person ).Cascade.All();
        Map( x => x.State );
}

Редактировать: с добавлением новой информации вам действительно нужно настроить класс Repository, где вы обрабатываете удаление сотрудника, чтобы выполнить поиск всех водительских прав, у которых есть этот человек. Скорее всего, вам нужно написать выражение Criteria, чтобы справиться с этим.

После того, как вы получите этот список, вы хотите удалить все эти объекты и убедиться, что вы удалили эти удаления, ТО затем удалите запись о человеке и удалите ее.

В ситуации, которую вы объяснили, что нежелание потерянных данных выполнять так, как вы хотите, ограничивало и не хотело иметь класс водительских прав внутри класса person, невозможно обработать каскадным удалением любого типа (насколько мне известно. )

...