Nhibernate слушатель/событие для замены объекта перед вставкой/обновлением

StackOverflow https://stackoverflow.com/questions/4566177

  •  14-10-2019
  •  | 
  •  

Вопрос

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

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

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 } }
}

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

Городской поисковый имени используется для предотвращения некоторых ошибок в городе тип пользователя. Например, если имя города является «Монреал», имя для поиска будет «Монреаль». Если город называется «Сент -Джонс», имя для поиска будет «Стджон» и т. Д.

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

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

Я попробовал это:

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

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

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

Все работает нормально!

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top