2010-09-17 4 views
1

Я только начал входить в EF, и я пытаюсь обвести вокруг него (как правило, достаточно легко). Однако по какой-то причине он фактически не сохраняет результаты, хотя, похоже, он может кэшировать значения за какое-то время, а затем вернуться к предыдущим значениям?Entity Framework на самом деле не сохраняет изменения

using (IAPlayerEntities IAPE = new IAPlayerEntities()) { 
       ObjectSet<Player> Players = IAPE.Players; 
       if (Players.Count() > 0) { 
        Player currentPlayer = new Player(); 
        bool LoggedIn = false; 
        Players.DefaultIfEmpty(null); 
        while (!LoggedIn) { 
         Console.WriteLine("Please enter your Username:"); 
         string username = Console.ReadLine(); 
         Console.WriteLine("Please enter your Password:"); 
         string password = MaskLine(); 
         currentPlayer = Players.FirstOrDefault(r => r.Password == password && r.Name == username); 
         LoggedIn = (currentPlayer != null); 
         if (!LoggedIn) { 
          Console.WriteLine("{0}Invalid combination, please try again.", Environment.NewLine); 
         } 
        } 
        Console.WriteLine("{0}Please choose your colony.", Environment.NewLine); 
        foreach (Colony col in currentPlayer.Colonies) { 
         Console.WriteLine(@"{0}{1}:{0}{2}{0}Level {3}", Environment.NewLine, col.ID, col.Name, col.Level); 
        } 
        Console.WriteLine(); 
        int colID = -1; 
        string colStr = Console.ReadLine(); 
        while (!int.TryParse(colStr, out colID) || !currentPlayer.Colonies.Any(e => e.ID == colID)) { 
         if (colStr.ToLower() == "q") { 
          Console.WriteLine("Goodbye!"); 
          return; 
         } 
         Console.WriteLine("{0}Invalid Colony. Please try again.", Environment.NewLine); 
         colStr = Console.ReadLine(); 
        } 
        Console.WriteLine("Please enter a new name for the colony:"); 
        string colName = Console.ReadLine(); 
        bool b = IAPE.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified).Any(); 
        currentPlayer.Colonies.First(e => e.ID == colID).Name = colName; 
        int change = IAPE.SaveChanges(); 
        if (change >= 1) { 
         Console.WriteLine("{0}Colony has been renamed.", Environment.NewLine); 
        } else { 
         Console.WriteLine("{0}Colony could not be renamed.", Environment.NewLine); 
        } 
       } else { 
        Console.WriteLine("No Registered users"); 
       } 
      } 

Игнорируйте безопасный вход в систему über, только там, чтобы получить от него объект для тестирования.

bool b имеет значение true перед сохранением, а затем, если я использую отладчик для запуска той же строки в панели «Немедленное окно», тогда он показывает false. Который мне, значит, он спасся? И если я повторно запускаю приложение после его закрытия, то измененное значение будет на месте. Но в конце концов он вернется к предыдущему значению, и если я проверю базу данных сразу после того, как она покажет исходное имя, значит, я не совсем уверен, что здесь происходит?

Это работает на VCS2010, так Framework 4.

Благодарности, Psy

+2

Это похоже на то, что он должен * сохранить изменения в хранилище данных. Я бы посмотрел на ваш метод обновления (используете ли вы сохраненное proc или другое изменение сопоставления при обновлениях?) И/или транзакционный контекст, чтобы начать вызывать его. –

ответ

2

Проверено, что SQL переходит к базе данных, и после некоторого расследования выяснилось, что у меня была копия базы данных в рамках проекта, которая перегружалась с той, которая была на выходе, каждый раз, когда я ее перестраивал.

+0

Была такая же проблема. Прикрепление БД с проектом приятно для развертывания, но не очень полезно во время отладки ... –

+0

Как вы это исправили? – Brett

+0

@Brett Я точно не помню (как это было более 2 лет назад), но, возможно, просто изменил действие сборки на файл на «Нет», а не «Контент» или «Копировать на вывод» – Psytronic

0

IAPE.Savechanges() в какой-то момент.