0

J'écris une application de commerce électronique ASP.NET MVC à l'aide de NHibernate et je souhaite que l'utilisateur final puisse contrôler la commande de catégories de produits (pas seulement les afficher de manière alphanumérique, etc.).NHibernate - Entités de tri basées sur la propriété/colonne + comment gérer?

Normalement, j'ajouterais une colonne OrderIndex/Sort (de type int) à la table Category, et une propriété à la classe de domaine Category. Mais le problème est de devoir gérer en permanence cette colonne spéciale OrderIndex/Sort car les catégories sont triées, ajoutées et supprimées. Je préfère le cacher et le rendre transparent pour que les appelants n'aient pas à définir la propriété directement. Bien sûr, je pourrais écrire mon propre code pour gérer tout cela, mais je voulais savoir si NHibernate avait quelque chose de construit qui pourrait m'aider, ou s'il pouvait accrocher cette propriété automatiquement. Si ce n'était pas le cas, je pensais à créer une classe de base OrderedEntity (tous les objets de domaine dérivent d'une base Entity), et créer un référentiel de base IOrderedRepository. Quelque chose comme ceci:

public class Entity 
{ 
    public virtual int Id { get; set; } 
} 

public class OrderedEntity : Entity 
{ 
    public virtual int OrderIndex { get; set; } 
} 

public class Category : OrderedEntity 
{ 

} 

public interface IRepository<T> where T : Entity 
{ 
    T FromId(int id); 
    void Save(T entity); 
} 

public interface IOrderedRepository<T> : IRepository<T> where T : OrderedEntity 
{ 
    void MoveUp(int places); 
    void MoveDown(int places); 
} 

Est-ce que cela semble être une bonne approche? Je ne veux pas réinventer une roue inférieure.

Répondre

1

Jusqu'à présent, je sais Hibernate a une annotation @OrderBy où vous pouvez spécifier la commande lorsque la collection est chargé. Mais Hibernate ne gérera pas la position que pour vous lorsque vous add ou remove élément de la collection.

Vous pouvez cependant facilement faire vous-même et fournir des méthodes et addItemremoveItem sur l'entité mère , qui gardera la trace de la position (ou les méthodes MoveUp et MoveDown comme vous le suggérez).

Questions connexes