Nhibernate слушатель/событие для замены объекта перед вставкой/обновлением
-
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, создавая/обновлять его по мере необходимости.