【发布时间】:2010-12-30 20:49:10
【问题描述】:
我有一个包含地址集合的公司类。
这是我的地址类:(写在我的头上):
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 } }
}
Address 保存在他自己的表中,并具有对城市 ID 的引用。城市也坚持在自己的表中。
城市的 SearchableName 用于防止用户键入的城市出现一些错误。例如,如果城市名称是“蒙特利尔”,则可搜索名称将是“蒙特利尔”。如果城市名称是“St. John”,则可搜索的名称将是“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,我会得到一个“空标识符”异常。我试图在地址和公司上捕获插入/更新,但如果是第一个插入的城市(这是逻辑......)
有什么想法吗?
谢谢
【问题讨论】:
-
我想知道为什么您要使用事件侦听器而不是在代码部分创建地址对象?当您想使用事件侦听器时,我有一个建议,该建议仅在地址具有 Id 时才有效。地址有Id吗?
-
是的,地址有一个Id。那是因为在添加/更新公司、客户、用户等时将使用地址......我想写一些东西,这些东西将针对每种情况进行处理。如果我将来在另一个类中添加地址类引用(比如说......添加一个带有地址的供应商类),则无需考虑对该类进行搜索/替换。
-
我愿意接受除事件/监听器之外的任何其他解决方案。
标签: nhibernate events listeners