Come gestire i dati di ricerca in un'applicazione C # ASP.Net MVC4?

0

Sto scrivendo un'applicazione MVC4 per tenere traccia dei documenti che abbiamo in archivio per i nostri clienti. Sto utilizzando il codice per primo e ho creato modelli per i miei oggetti (Azienda, Documento, ecc.). Ora mi trovo di fronte all'argomento della scadenza dei documenti.

La logica aziendale impone che determinati documenti scadano per un determinato numero di giorni dopo la data del documento. Ad esempio, il documento A potrebbe scadere dopo 180 giorni, il documento 2 in 365 giorni, ecc ... Ho una classe per i miei documenti come mostrato di seguito (semplificata per questo esempio).

Qual è il modo migliore per me di creare una ricerca per i valori di scadenza? Voglio specificare i documenti di tipo DocumentA scadono in 30 giorni, digita DocumentB scade tra 75 giorni, ecc ... Posso pensare ad alcuni modi per farlo:

  1. Tabella di ricerca nel database che posso interrogare
  2. Nuova proprietà nella mia classe (DaysValidFor) che ha un getter personalizzato che restituisce valori diversi in base a DocumentType
  3. Un metodo che accetta il tipo di documento e restituisce il numero di giorni

e sono sicuro che ci sono altri modi a cui non sto nemmeno pensando. La mia preoccupazione principale è a) non violare alcuna best practice e b) manutenibilità. Ci sono dei pro / contro che devo sapere per le opzioni di cui sopra, o si tratta di un caso di "sceglierne solo uno ed eseguirlo"?

Un ultimo pensiero, in questo momento il numero di giorni è un valore che non ha bisogno di essere archiviato ovunque su una base per documento - tuttavia, è possibile che la logica aziendale modifichi questo (cioè, i DocumentA sono 30 giorni scadenza per impostazione predefinita, ma questo DocumentoA associato alla Società XYZ sarà di 60 giorni perché ci piacciono). In tal caso, una proprietà nella classe Document è il modo migliore per andare, visto che ho bisogno di aggiungere quel campo al DB?

namespace Models
{
    // Types of documents to track
    public enum DocumentType
    {
        DocumentA,
        DocumentB,
        DocumentC // etc...
    }

    // Document model
    public class Document
    {
        public int DocumentID { get; set; }

        // Foreign key to companies
        public int CompanyID { get; set; }

        public DocumentType DocumentType { get; set; }

        // Helper to translate enum's value to an integer for DB storage
        [Column("DocumentType")]
        public int DocumentTypeInt
        {
            get { return (int)this.DocumentType; }
            set { this.DocumentType = (DocumentType)value; }
        }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:MM-dd-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DocumentDate { get; set; }


        // Navigation properties
        public virtual Company Company { get; set; }
    }
}
    
posta Jim 01.10.2013 - 19:26
fonte

2 risposte

2

Se DaysValidFor è una proprietà del tipo di documento, quindi inseriscilo nella tabella DocumentType e cercalo o aggiungilo alla tabella Documents .

Se DaysValidFor può essere personalizzato, aggiungi un campo DaysValidFor alla tabella Documenti e usa DaysValidFor nella tabella DocumentType come valore predefinito quando crei un nuovo record Document .

Motivazioni

Avendo una tabella DocumentType dall'inizio, si fornisce un contenitore in base al quale tutti i tipi di altre funzionalità diventano possibili in funzione di quel tipo di documento. Evita anche una riprogettazione quando scopri che ti serve una tabella DocumentType e non ne hai fornita una. Non tutti gli oggetti del dominio hanno bisogno di una tabella di questo tipo, ma i documenti sono naturalmente organizzati in categorie, quindi è una buona idea qui.

Puoi avere un metodo DaysValidFor nel tuo repository se ne vuoi uno. Passa il DocumentID e guarda il valore su dalla tabella Documents .

Se pensi in termini di classi anziché di tabelle (cioè "codice prima"), sostituisci semplicemente la parola "classe" per la parola "tabella" nei due paragrafi precedenti.

    
risposta data 01.10.2013 - 19:32
fonte
0

Hum, a ciascuno il suo modo di vedere le cose, ma per me questo non ha nulla a che fare con C # MVC 4, e tutto ciò che ha a che fare con il database stesso, poiché questo è collegato ai dati, non come sono accesso.

Penso che creerei una vista (vista SQL, non MVC ...) con una colonna calcolata per la data di scadenza. In questo modo puoi utilizzare qualsiasi criterio tu voglia, controllare se i documenti sono collegati, la società, il tipo di documento, tutto ciò che ti serve e modificare questi criteri per il tempo necessario, senza alcuna modifica nell'applicazione MVC.

So che puoi creare stored procedure con Code First, non sono troppo sicuro di Views, ma in realtà dal mio punto di vista questo appartiene al database, quindi è quello che cercherò di fare.

    
risposta data 02.11.2013 - 18:00
fonte

Leggi altre domande sui tag