MVC4: come creare un modello in fase di esecuzione?

3

Nel mio progetto sto creando dinamicamente una tabella dando il nome della tabella (es. studente) e aggiungendo campi a quella tabella e quindi salvando la tabella. Ora, la mia tabella è creata nel database di SQL Server.

Assume tabella ha dati e voglio mostrare i dati della tabella (ex studente) su WebGrid. Ma il problema è che non ho un modello per quel tavolo (es. Studente). Quindi, come posso creare il modello per la tabella appena creata o come posso mostrare i dati su WebGrid?

    
posta Vicky 09.05.2014 - 15:31
fonte

4 risposte

7

Non farlo

In realtà non dovresti modificare lo schema della tabella in fase di runtime. Ogni genere di cose può andare storto. Potresti avere qualcuno che tenta di creare una colonna che si rivela essere una parola riservata. L'accesso che stai dando all'utente per essere in grado di fare questi cambiamenti permette cose come dropping tables anche.

davvero non dovrebbe modificare lo schema della tabella in fase di runtime. Significa che non stai utilizzando gran parte di ciò che un database è buono a

Prova invece una struttura di tabella EAV

Se stai scrivendo dati dinamici in cui le colonne cambiano e vengono create arbitrariamente, considera l'utilizzo di un EAV struttura della tabella. È noto e comprende come funziona.

Sì, vari DBA e puristi ci daranno da fare, ma suggerirai la soluzione proposta di aggiungere colonne in fase di runtime, probabilmente si arrenderanno. Puoi anche trovare le librerie che ti permetteranno di scrivere un modello per tale come EAV @ CodePlex ).

Forse prova qualcosa su NoSQL

Forse non vuoi affatto un database relazionale. Forse vuoi qualcosa che ha un modello di documento e stai solo attaccando Json lì. Allora mongo o divano funzionerebbero in modo accettabile. O forse vuoi un database orientato alle colonne come Cassandra. Non ne sono sicuro, ma è qualcosa da esplorare se lo sei davvero dopo aver pensato "creando colonne in runtime".

Ok, lo stai davvero facendo

Puoi recuperare i metadati da un tavolo. Nel mondo Java, questo sarebbe qualcosa come ResultSetMetaData che ti consente scopri le specifiche di tutte le colonne, i tipi di dati che memorizzano e altri bit a riguardo.

In C #, apparentemente questo è memorizzato nella classe DataColumn . Da Recupero di metadati (nome tabella) da un'istruzione SQL su Stack Overflow:

SqlConnection con = new SqlConnection(connString);
String queryString = "Select CUSTOMER_NAME from CUSTOMER_DETAIL";
SqlCommand cmd = new SqlCommand(queryString, con);
DataTable myTable = new DataTable();
myTable.Load(cmd.ExecuteReader());
DataColumn column = myTable.Columns[0];
// zero based index of column, alternatively use column name
string typeOfColumn = column.DataType.Name;
// or column.DataType.FullName to get the fully qualified name of the System.Type
    
risposta data 12.05.2014 - 04:01
fonte
1

Se non sai cosa c'è in una tabella, non dovresti provare a visualizzarlo ovunque! Che cosa succede se è pieno di dettagli della carta di credito (Yowch!) O password nei campi "anonimi" (Eek!)?

E li metti tutti sullo schermo perché tutti possano vederli?
Per me, al limite è irresponsabile.

hai bisogno di sapere cosa c'è dentro prima di provare a fare qualsiasi cosa con esso.

Dici di creare un campo dinamico nel tuo database. OK; non è un buon modo per progettare il tuo database nel mio libro, ma è un modo. Ti suggerisco di creare tabelle dei metadati - solo più tabelle nel tuo database - che descrivi le tabelle reali utilizzate attualmente dall'applicazione. Avrai bisogno (almeno)

  • una tabella di metadati che descrive ciascuna tabella reale e
  • un'altra tabella di metadati che descrive ciascuna colonna all'interno di ciascuna tabella reale.

Questi metadati possono essere interrogati in fase di esecuzione e [con precisione] descrive ogni tabella e campo nel database, cosa contiene e se è possibile visualizzarlo, tra le altre cose. Inoltre documenti il tuo database "progetta", anche se è stato creato "in volo".

La cosa importante è che tutto questo è integrato in qualsiasi U.I. tu usi per costruire i tuoi veri tavoli - devi riempire questo materiale ("scriverlo") prima di aggiungere il campo al database.

    
risposta data 12.05.2014 - 14:21
fonte
0

Non è la soluzione migliore, ma dovrebbe funzionare.

Per visualizzare i dati della tabella, solo l'input che hai è il nome della tabella. Così farai

string sql = "SELECT * from " + tableName;

Quindi riempire un DataSet e quindi convertire DataSet in List<List<string>> oggetto come in questa risposta . Passa al tuo view . Passa attraverso di essa in view per visualizzare i dati tabulari. L'avvertimento qui è che gestirai tutti i tipi di dati come stringa.

Non penso che sarai in grado di utilizzare WebGrid

    
risposta data 09.05.2014 - 16:50
fonte
-1

Puoi interrogare quella tabella dinamica e recuperare quei risultati in un DataTable nel modo tradizionale.

Dopo questo è possibile seralizzare questo in una stringa json. link ... ti mostra come.

Questi possono quindi essere facilmente consumati dalle librerie js come knockout.js, o, jquery, ecc. e renderizzati sulla pagina Web.

    
risposta data 09.05.2014 - 17:25
fonte

Leggi altre domande sui tag