168 messaggi dal 10 agosto 2019
ciao a tutti ,vorrei evitare che una colonna abbia lo stesso valore per più righe ,per evitare questo ho aggiunto un vincolo unique,provando ad inserire lo stesso valore viene sollevata un eccezione,mi domandavo quanto era pesante produrre quest'eccezione e se forse conviene fare prima una select per verificare l'esistenza del valore (il codice è quanto meno migliorabile) :
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("IdMacroArea,NumeroRiga,NumeroColonna,TestoNomeMacroarea")] MacroAree macroAree)
        {
            if (ModelState.IsValid)
            {                
                try {
                    string TestoNomeMacroarea = macroAree.TestoNomeMacroarea;
                    var macro = await _context.MacroAree.FirstOrDefaultAsync(m => m.TestoNomeMacroarea == TestoNomeMacroarea);
                    if(macro==null) { 
                        _context.Add(macroAree);                    
                        await _context.SaveChangesAsync();
                    } else
                    {       
                        //da cambiare
                        string message = "esiste già un elemento con questo nome: ";
                        ViewData["messaggio"] = message + TestoNomeMacroarea;                        
                        return View();
                    }
                }
                catch(SqlException excp)
                {
                    //log here
                    string msg = excp.Message.ToString();
                }                
                return RedirectToAction(nameof(Index));
            }
            return View(macroAree);
        }


il codice potrebbe far sembrare superfluo il vincolo unique sulla colonna ma non mi sembra una grande soluzione...
461 messaggi dal 08 febbraio 2009
Ciao

Non sono un esperto in materia, però di norma preferisco lasciare i controlli lato DB (quindi lasciare che si scateni l'eccezione).
I motivi principali sono due:

- Il fatto che tu faccia la query di controllo non è garanzia di funzionamento. Potrebbe capitare che fra la select per controllare i dati su DB e la insert che fai poco dopo, ci sia un utente che fa a sua volta la insert con il medesimo valore. In tal caso avresti comunque l'eccezione

- Oltre al problema di cui sopra, in linea di massima credo che fare una select sia sempre più oneroso per il DB rispetto a scatenare un'eccezione. Tieni presente che, oltre al lavoro del DB, ci aggiungi anche tutto il lavoro di EF, ovvero quello di convertire i dati SQL in entità .NET (classi).


Questo è il mio punto di vista, poi vedi te

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.