NHibernate слушатель / событие для замены объекта перед вставкой / обновлением - PullRequest
1 голос
/ 30 декабря 2010

У меня есть класс компании, в котором есть коллекция адресов.

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

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

Это класс City:

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

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

SearchableName города используется, чтобы предотвратить некоторые ошибки в городе типа пользователя.Например, если название города - «Монреаль», имя для поиска будет «Монреаль».Если название города - «Св. Иоанн», то имя для поиска будет «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 только для чтения, если я установил @ event.Entity.Id, я получаю исключение «нулевой идентификатор».Я пытался перехватить вставку / обновление по адресу и по компании, но по городу, если первым вставить его (это логика ...)

Есть мысли?

Спасибо

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

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

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

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

0 голосов
/ 07 января 2011

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

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

Работает отлично!

...