У меня есть класс компании, у которого есть коллекция 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». Я попытался уловить вставку/обновление в Адрес и на Компанию, но Город, если первый вставлен (это логика ...)
Любые мысли?
Благодаря
Интересно, почему вы хотите сделать это с помощью прослушивателя событий, а не в части кода, создает объект адреса? Если вы хотите использовать прослушиватель событий, у меня есть предложение, которое будет работать только тогда, когда адрес имеет идентификатор. Имеет ли адрес идентификатор? – Paco
Да, адрес имеет идентификатор. Thats, потому что адрес будет использоваться при добавлении/обновлении компаний, клиентов, пользователей и т. Д. ... Я хотел бы написать что-то однажды, которое будет обработано для каждого случая. И если я добавлю ссылку на класс адреса в будущем в другом классе (скажем ... добавив класс поставщика с адресом), не нужно будет думать о выполнении поиска/замены для этого класса. – vIceBerg
Я открыт для любых других решений, кроме событий/слушателей. – vIceBerg