我有一个公司类,其中包含一个地址集合。
这是我的地址课:(写在我的头顶):
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”异常。我试图在地址和公司上捕获插入/更新,但是如果插入第一个插入城市(这是逻辑......)
有什么想法吗?
由于
答案 0 :(得分:1)
你正在以错误的水平处理这个问题。
这不应该发生在事件监听器中,而是发生在更高级别(称为服务,模型,无论如何)。
在 尝试插入新记录之前,服务应尝试按SearchableName加载城市,根据需要创建/更新。
答案 1 :(得分:0)
我决定使用Stored Proc来处理此类的插入和更新。
SP,如果可搜索的名称已存在,则返回其id。否则,插入。
一切正常!