Пример #1
0
            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);
            }
Пример #2
0
        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);
        }
Пример #3
0
 public static bool IsSolvable(Level level, SolveMode solveMode = SolveMode.ShortestSolution)
 {
     return(SolveLevel(level).Count > 0);
 }