public static List <LevelSolution> SolveLevel(Level level, SolveMode solveMode = SolveMode.ShortestSolution) { // TODO: This function is probably very inefficient. Investigate performance improvements // Note: The method seems to perform fast (enough) but need to investigate the memory usage var solutions = new List <LevelSolution>(); if (solveMode == SolveMode.AllSolutions) { solutions.AddRange(GetAllUniqueSolutions(level)); } else { solutions.Add(GetShortestSolution(level)); } return(solutions); }
public void Run() { Debugger.Break(); int speakerId = 2; // Entität mit Id laden und verändern Speaker speaker = _efContext.Find <Speaker>(speakerId); // Attribut muss Concurrency-Token oder RowVersion sein speaker.Updated = DateTime.Now; Thread.Sleep(250); // Attribut (Spalte) direkt in der Datenbank ändern const string SQLUPDATE = "UPDATE [dnc].[Speakers] SET Updated = GETDATE() WHERE Id = @Id"; int rowCount = _efContext.Database.ExecuteSqlCommand(SQLUPDATE, new SqlParameter("Id", speakerId)); SolveMode mode = SolveMode.ClientWins; bool savingFailed = false; do { try { // Nun Entität speichern // Es sollte zu einer DbUpdateConcurrencyException kommen _efContext.SaveChanges(); savingFailed = false; } catch (DbUpdateConcurrencyException ex) { savingFailed = true; switch (mode) { case SolveMode.ClientWins: // Client wins ex.Entries.ToList().ForEach(e => e.OriginalValues.SetValues(e.GetDatabaseValues())); break; case SolveMode.StoreWins: ex.Entries.ToList().ForEach(e => e.Reload()); break; case SolveMode.Custom: ex.Entries.ToList().ForEach(e => { var currentValues = e.CurrentValues; var databaseValues = e.GetDatabaseValues(); var resolvedValues = databaseValues.Clone(); // Hier kommt die Logik zur Auflösung der Ausnahme e.OriginalValues.SetValues(databaseValues); e.CurrentValues.SetValues(resolvedValues); }); break; default: break; } } } while (savingFailed); }
public static bool IsSolvable(Level level, SolveMode solveMode = SolveMode.ShortestSolution) { return(SolveLevel(level).Count > 0); }