【问题标题】:NHibernate listener/event to replace object before insert/updateNHibernate 侦听器/事件在插入/更新之前替换对象
【发布时间】: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


【解决方案1】:

你在错误的层面上处理这个问题。

这不应该发生在事件侦听器中,而应该发生在更高级别(称之为服务、模型等)。

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

【讨论】:

  • 使用我的映射,Company 类负责保存地址。我将地址添加到公司的集合 (myCie.AddAddress(myNewAddress)) 并调用 session.save(myCie) 处理所有事情。正如我在对@Paco 的评论中所说,客户有地址,用户有地址。我想要在任何情况下都能处理地址所在城市的东西。
【解决方案2】:

我决定使用存储过程来处理此类的插入和更新。

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

效果很好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2015-07-11
    • 2010-12-30
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多