2010-12-30 3 views
1

У меня есть класс компании, у которого есть коллекция Address.Слушатель NHibernate/событие для замены объекта перед вставкой/обновлением

Вот мой адрес класса: (написано сверху моей головы):

public class Address 
{ 
    public string Civic; 
    public string Street; 
    public City City; 
} 

Это класс Город:

public class City 
{ 
    public int Id; 
    public string Name; 
    public string SearchableName{ get { //code } } 
} 

-адрес сохраняется в своей таблице и имеют ссылку на Идентификатор города. Город также сохранился в собственной таблице.

Городское имя для поиска используется для предотвращения ошибок в городе. Например, если название города «Montréal», имя для поиска будет «montreal». Если название города «Св. Иоанна», имя для поиска будет «stjohn» и т. Д.

Он используется в основном для поиска и предотвращения наличия нескольких городов с опечаткой в ​​нем.

Когда я сохраняю адрес, я хочу прослушиватель/событие, чтобы проверить, находится ли город в базе данных. Если это так, отмените вставку и замените город пользователя базой данных. Я хотел бы, чтобы такое же поведение с обновлениями.

Я попытался это:

public bool OnPreInsert(PreInsertEvent @event) 
{ 
    City entity = (@event.Entity as City); 

    if (entity != null) 
    { 
     if (entity.Id == 0) 
     { 
      var city = (from c in @event.Session.Linq<City>() 
         where c.SearchableName == entity.SearchableName 
         select c).SingleOrDefault(); 
      if (city != null) 
      { 
       //don't know what to do here 
       return true; 
      } 
     } 
    } 

    return false; 
} 

Но если уже есть город в базе данных, я не знаю, что делать. @ event.Entity является readonly, если я устанавливаю @ event.Entity.Id, я получаю исключение «null identifier». Я попытался уловить вставку/обновление в Адрес и на Компанию, но Город, если первый вставлен (это логика ...)

Любые мысли?

Благодаря

+0

Интересно, почему вы хотите сделать это с помощью прослушивателя событий, а не в части кода, создает объект адреса? Если вы хотите использовать прослушиватель событий, у меня есть предложение, которое будет работать только тогда, когда адрес имеет идентификатор. Имеет ли адрес идентификатор? – Paco

+0

Да, адрес имеет идентификатор. Thats, потому что адрес будет использоваться при добавлении/обновлении компаний, клиентов, пользователей и т. Д. ... Я хотел бы написать что-то однажды, которое будет обработано для каждого случая. И если я добавлю ссылку на класс адреса в будущем в другом классе (скажем ... добавив класс поставщика с адресом), не нужно будет думать о выполнении поиска/замены для этого класса. – vIceBerg

+0

Я открыт для любых других решений, кроме событий/слушателей. – vIceBerg

ответ

0

Я решил использовать Хранимый Proc для обработки Вложений и обновлений для этого класса.

SP, если имя для поиска уже существует, возвращает его id. Иначе, вставьте.

Он отлично работает!

1

Вы имеете дело с этим на неправильном уровне.

Это не должно происходить в прослушивателе событий, но на гораздо более высоком уровне (назовите его службой, моделью и т. Д.).

Перед пытается вставить новую запись, то служба должны попытаться загрузить город по SearchableName, создание/обновление его по мере необходимости.

+0

С моим картографированием класс компании несет ответственность за сохранение адресов. Я добавляю адрес в коллекцию компании (myCie.AddAddress (myNewAddress)), а вызов session.save (myCie) имеет дело со всем. Как я уже сказал в своем комментарии к @Paco, у клиентов есть адреса, у пользователей есть адреса. Я хотел бы что-то, что будет обрабатывать город адреса в каждом случае. – vIceBerg

+0

Нет предложений? – vIceBerg

Смежные вопросы