codice SubSonic generato iscrizioni filtraggio sempre
-
02-10-2019 - |
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?
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.