2010-04-28 4 views
2

J'ai une table appelée "Users" qui a une colonne appelée "deleted", un booléen indiquant que l'utilisateur est "Supprimé" du système (sans le supprimer, bien sûr).Code généré par SubSonic et filtrant toujours les enregistrements

J'ai aussi beaucoup de tables qui ont un FK à la colonne Users.user_id. Subsonic génère (très bien) le code pour toutes les clés étrangères d'une manière similaire:

public IQueryable<person> user 
    { 
     get 
     { 
       var repo=user.GetRepo(); 
       return from items in repo.GetAll() 
        where items.user_id == _user_id 
        select items; 
     } 
    } 

Alors que cela est bon et tout, est-il un moyen de générer le code de telle manière de filtrer toujours le " Supprimé "utilisateurs aussi?

Dans le bureau ici, la seule suggestion que nous pouvons penser est d'utiliser une classe partielle et de l'étendre. Ceci est évidemment une douleur quand il y a beaucoup, beaucoup de classes en utilisant la table de l'utilisateur, sans parler du fait qu'il est facile à utiliser, par inadvertance, la mauvaise propriété (utilisateur vs ActiveUser dans cet exemple):

public IQueryable<User> ActiveUser 
    { 
     get 
     { 
       var repo=User.GetRepo(); 
       return from items in repo.GetAll() 
        where items.user_id == _user_id and items.deleted == 0 
        select items; 
     } 
    } 

Toutes les idées ?

Répondre

3

Vous devez modifier le code suivant dans votre fichier ActiveRecord.tt et régénérer votre code:

code suivant est est situé sous: #region ' Foreign Keys '

Mise à jour: J'ai code mis à jour pour votre commentaire pour vérifier si la colonne de suppression est disponible, puis appliquer uniquement la condition de suppression.

HasLogicalDelete() - Cette fonction retournera true si la table a une colonne "deleted" ou "isdeleted", false sinon.

public IQueryable<<#=fk.OtherClass #>> <#=propName #> 
{ 
    get 
    { 

      var repo=<#=Namespace #>.<#=fk.OtherClass#>.GetRepo(); 

      <#if(tbl.HasLogicalDelete()){#> 

      return from items in repo.GetAll() 
       where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#> && items.deleted == 0 
       select items; 

      <#}else{#> 

      return from items in repo.GetAll() 
       where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#> 
       select items; 

      <#}#> 
    } 
} 
+0

@cmroanirgo - Vérifiez mon code mis à jour et répondez. – Krunal

+0

C'est exactement la réponse que je cherchais. Je n'ai même pas commencé à penser que SubSonic pourrait déjà avoir ça! – cmroanirgo

0

Utilisez-vous Subsonic3? Si c'est le cas, vous pouvez réellement modifier les modèles pour modifier la façon dont les classes Data Access Layer sont générées.

Questions connexes