NHibernate监听器/事件在插入/更新之前替换对象

时间:2010-12-30 20:49:10

标签: nhibernate events listeners

我有一个公司类,其中包含一个地址集合。

这是我的地址课:(写在我的头顶):

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

地址会保留在他自己的表格中,并且会引用该城市的ID。城市也坚持自己的桌子。

City的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;
}

但是如果数据库中已有City,我不知道该怎么做。 @event.Entity是readonly,如果我设置@ event.Entity.Id,我会得到一个“null identifier”异常。我试图在地址和公司上捕获插入/更新,但是如果插入第一个插入城市(这是逻辑......)

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

你正在以错误的水平处理这个问题。

这不应该发生在事件监听器中,而是发生在更高级别(称为服务,模型,无论如何)。

尝试插入新记录之前,服务应尝试按SearchableName加载城市,根据需要创建/更新。

答案 1 :(得分:0)

我决定使用Stored Proc来处理此类的插入和更新。

SP,如果可搜索的名称已存在,则返回其id。否则,插入。

一切正常!