277 messaggi dal 03 ottobre 2006
Ho un file csv proveniente dalla esportazione di un altro gestionale
Questo file ha una colonna Id che è una chiave nell'altro gestionale ma nella mia entità lo devo importare dopo aver aggiunto una mia chiave identity EventoID, quindi la mia entità ha solo EventoID come chiave primaria
vorrei fare in modo che durante l'importazione, se la riga esiste già nel mio DB venga modificata la riga del DB altrimenti la aggiunga e per far questo uso questo codice:

public void AddToEventi(IList<Evento> eve) //eve contiene tutte le colonne della mia Entità tranne la mia chiave primaria dato che eve lo riempio con il file csv che non ha EventoID
{
foreach (Evento ev in eve)
{
if (_db.ListEventi.Any(e => e.Id == ev.Id)) //cerco l'evento nel mio DB con la chiave Id dell'altro gestionale
{
Evento evento = _db.ListEventi.Single(x => x.Id == ev.Id); //carico l'evento che ho trovato nel DB
evento.Title = ev.Title; //cambio il valore di una colonna rispetto a quello che è memorizzato nel DB
_db.Entry(evento).State = System.Data.Entity.EntityState.Modified;
_db.ListEventi.Attach(evento); //non modifica il record
}
else
{
_db.Entry(ev).State = System.Data.Entity.EntityState.Added;
_db.ListEventi.Add(ev);
}
try
{
_db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
}
}
}

L'inserimento di nuove righe funziona bene perchè la mia chiave EventoID viene generata automaticamente ma la modifica non la fa nel senso che la riga trovata rimane inalterata
Come mai ?

Questa istruzione
Evento evento = _db.ListEventi.Single(x => x.Id == ev.Id);
la faccio per poter caricare tutta la mia entità compresa la mia chiave primaria altrimenti la modifica non la farebbe perchè immagino la mia chiave gli serva
16 messaggi dal 06 marzo 2017
Una domanda, 'ev.Id' non è la chiave della tua tabella, ma l'id che ti arriva che tu salvi nella tua tabella giusto?
277 messaggi dal 03 ottobre 2006
si, ev.id è la chiave per il gestionale esterno che mi esporta il file in csv ma sul mio database è una stringa qualsiasi.
Non posso usarla anch'io come chiave sul mio gestionale perchè l'utente dovrà anche inserire questi eventi a mano (non solo importandoli) e quindi avrei dovuto creare dei nuovi valori per quella chiave che avrebbero poi fatto confusione con il suo gestionale
277 messaggi dal 03 ottobre 2006
Per il momento ho risolto in questa forma orripilante... mi pare la sagra delle ridondanza, e non ci credo non esista una soluzione più performante o elegante

public void AddToEventi(IList<Evento> eve) //eve contiene tutte le colonne importate dal file csv
{
foreach (Evento ev in eve)
{

if (_db.ListEventi.Any(e => e.Id == ev.Id)) //se il record esiste nella mia tabella
{
_db1 = new SkipContext();
Evento evento = _db.ListEventi.Single(x => x.Id == ev.Id); //Carico tutta la riga della mia tabella in modo da poter avere anche la mia chiave primaria EventoID
Evento eventomod = CreaEntitaEvento(ev, evento); // Aggiorno la mia riga con le 45 colonne della riga proveniente dal file csv che potrebbero essere state modificate
using (_db1)
{
_db1.SaveChanges();
}
}
else // aggiungo la riga

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.