Question

J'ai une classe de la société qui ont une collection d'adresse.

Voici ma classe Adresse: (en haut écrit de ma tête):

public class Address
{
  public string Civic;
  public string Street;
  public City City;
}

Ceci est la classe Ville:

public class City
{
  public int Id;
  public string Name;
  public string SearchableName{ get { //code } }
}

Adresse est persisté dans sa propre table et une référence à l'ID de la ville. Ville sont également persisté dans est propre table.

est utilisé le SearchableName de la ville pour éviter quelques erreurs dans la ville le type d'utilisateur. Par exemple, si le nom de la ville est « Montréal », le nom interrogeable sera « Montréal ». Si le nom de la ville est "St. John", le nom interrogeable sera "StJohn", etc.

Il est principalement utilisé pour la recherche et pour éviter d'avoir plusieurs villes avec une faute de frappe en elle.

Lorsque j'enregistre une adresse, je veux un auditeur / événement pour vérifier si la ville est déjà dans la base de données. Le cas échéant, annuler l'insertion et remplacer la ville de l'utilisateur avec une base de données. Je voudrais le même comportement avec des mises à jour.

J'ai essayé ceci:

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

Mais s'il y a déjà une ville dans la base de données, je ne sais pas quoi faire. @ Event.Entity est en lecture seule, si je mets @ event.Entity.Id, je reçois une exception « identificateur null ». J'ai essayé de piéger insert / mise à jour Adresse et sur la société, mais la ville si le premier à obtenir inséré (il est logique ...)

Toutes les pensées?

Merci

Était-ce utile?

La solution 2

j'ai décidé d'utiliser un procédure stockée pour gérer les insertions et modifications pour cette classe.

Le SP, si le nom interrogeable existe déjà, id s `retours. Sinon, insérer.

Il fonctionne très bien!

Autres conseils

Vous avez affaire à ce au mauvais niveau.

Cela ne devrait pas se produire dans un écouteur d'événement, mais dans un niveau beaucoup plus élevé (appeler le service, le modèle, peu importe).

Avant en essayant d'insérer un nouveau record, le Service devrait essayer de charger une ville par SearchableName, la création / mise à jour au besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top