Domanda

Ho una tabella chiamata "Utenti" che ha una colonna chiamata "cancellato", un valore booleano che indica che l'utente è "Cancellato" dal sistema (senza realmente eliminarlo, ovviamente).

Ho anche un sacco di tavoli che hanno un FK alla colonna Users.user_id. Subsonic genera (molto bene) il codice per tutte le chiavi esterne in modo simile:

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

Mentre questo è buono e tutti, c'è un modo per generare il codice in modo tale per sempre filtrare gli utenti "cancellati" troppo?

In ufficio qui, l'unico suggerimento che ci viene in mente è quello di utilizzare una classe parziale ed estenderlo. Questo è ovviamente un dolore quando ci sono un sacco di classi utilizzando la tabella utente, per non parlare del fatto che è facile da usare inavvertitamente la proprietà sbagliata (utente vs ActiveUser in questo esempio):

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

Tutte le idee?

È stato utile?

Soluzione

È necessario modificare seguente codice nel file ActiveRecord.tt e rigenerare il codice:

In seguito è il codice si trova sotto: #region ' Foreign Keys '

Aggiornamento:. codice che ho aggiornato per il tuo commento per verificare se la colonna di eliminazione è disponibile quindi applicare unica condizione di eliminazione

HasLogicalDelete() -. Questa funzione restituisce vero se tabella è "cancellato" o "isDeleted" colonna, altrimenti false

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;

          <#}#>
    }
}

Altri suggerimenti

Stai usando Subsonic3? Se è così allora si può effettivamente modificare i modelli di modificare il modo in cui le classi Data Access Layer vengono generati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top