2 votes

Nhibernate et classe de base d'entité

Je suis en train de mettre en œuvre une classe d'entité de base abstraite qui a redéfini les méthodes equals et GetHashcode... Voici ma classe d'entité de base

public abstract class Entity
{

public virtual TId Id { get; protected set; }
protected virtual int Version { get; set; }

public override bool Equals(object obj)
{
  return Equals(obj as Entity);
}

private static bool IsTransient(Entity obj)
{
  return obj != null &&
         Equals(obj.Id, default(TId));
}

private Type GetUnproxiedType()
{
  return GetType();
}

public virtual bool Equals(Entity other)
{
  if (other == null)
    return false;

  if (ReferenceEquals(this, other))
    return true;

  if (!IsTransient(this) &&
      !IsTransient(other) &&
      Equals(Id, other.Id))
  {
    var otherType = other.GetUnproxiedType();
    var thisType = GetUnproxiedType();
    return thisType.IsAssignableFrom(otherType) ||
           otherType.IsAssignableFrom(thisType);
  }

  return false;
}

public override int GetHashCode()
{
  if (Equals(Id, default(TId)))
    return base.GetHashCode();
  return Id.GetHashCode();
}

}

Comment la valeur de l'ID de base de l'entité est-elle assignée?

Les clés primaires de mes classes ont des types de données différents et les noms sont également différents pour chaque classe. Voici un exemple de mes classes:

public class Product : Entity
{
    public virtual Guid ProductId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual Decimal UnitPrice { get; set; }
}

public class Customer : Entity
{
    public virtual int CustomerID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual int Age { get; set; }
}

Je suis un peu confus sur la manière de définir la propriété ID de la classe de base. Est-ce que quelqu'un peut me suggérer à ce sujet, j'apprécierai toute aide.

3voto

Randy Burden Points 1578

Il vous suffit de passer un type à la classe de base héritée.

Consultez les commentaires dans les entités:

public class Product : Entity
{
    // La propriété ProductId n'est plus nécessaire car la
    // propriété Id de la classe de base sera de type Guid
    // et pourra servir de Id
    //public virtual Guid ProductId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual Decimal UnitPrice { get; set; }
}

public class Customer : Entity
{
    // La propriété CustomerID n'est plus nécessaire car la
    // propriété Id de la classe de base sera de type int
    // et pourra servir de Id
    // public virtual int CustomerID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual int Age { get; set; }
}

Maintenant, dans vos fichiers de mapping NHibernate, spécifiez simplement quelle est la colonne de base de données pour vos propriétés Id.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X