Ciao a tutti, sto sviluppando la mia prima applicazione che implementa Entity Framework. Ho già definito tutto il modello (concettuale, archiviazione e mapping), ma volevo implementare un sistema di cancellazione logica, che EF nativamente non supporta (che io sappia).
Quindi ho fatto l'override del metodo SaveChanges per andare ad eseguire la query direttamente sul db in caso di cancellazione di modo da non cancellare veramente il record, ma fare un UPDATE e marcare il mio record come cancellato.
Il problema però che quando intercetto l'eliminazione sto lavorando ovviamente con i miei oggetti "dal lato concettuale" e (come è giusto che sia) non conosco quale sia la loro rappresentazione sul database. Come faccio a risalire al nome della tabella in cui sono archiviati i miei dati riguardanti l'oggetto che sto eliminando, così da poter costruire la query di UPDATE?
Ecco il codice... vorrei sostituire quei ??????????????....
P.S. Il linguaggio non mi interessa.... io sto usando C#, ma se mi offrite una soluzione in VB.NET mi va bene lo stesso... mi arrangio.codice:public override int SaveChanges(System.Data.Objects.SaveOptions options) { var deleted = this.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted); foreach (var deletedItem in deleted) { var storeItem = this.MetadataWorkspace.GetItems<EntityType>(DataSpace.SSpace).Where(et => et.Name == ?????????).FirstOrDefault(); if (storeItem != null) { const string deleteSql = "UPDATE {0} SET recordDeleted = 1 WHERE 1=1 {1}"; // Trovo la proprieta var deleteProperty = storeItem.Properties.Where(ep => ep.Name == "recordDeleted").FirstOrDefault(); if (deleteProperty != null) { // Ciclo tutte le chiavi StringBuilder strWhere = new StringBuilder(); foreach (EntityKeyMember key in deletedItem.EntityKey.EntityKeyValues) { string strKey = " AND {0} = {1}"; strWhere.Append(string.Format(strKey, key.Key, key.Value)); } // Eseguo la Query this.ExecuteStoreCommand(string.Format(deleteSql, storeItem.Name, strWhere.ToString())); // Cambio lo State dell'Entità deletedItem.ChangeState(EntityState.Unchanged); } } } return base.SaveChanges(options); }![]()