Entity Framework не сохраняет обновления в базовой базе данных

Я использую следующий код для обновления времени входа и выхода в таблице записей, но он не сохраняет данные в базе данных. Я проверил файл mdf с помощью студии управления sql, и данные не сохранены. Что я делаю неправильно?

private void btClockIn_Click(object sender, EventArgs e)
    {
        using (TimeKeepEntities ctx = new TimeKeepEntities())
        {
          // if employee clocked out add new clock in record else update existing record with clock out time
            if (cmbProjects.Enabled)
            {
                tblTimeRecord record = new tblTimeRecord();
                record.RecordID = DateTime.Now; 
                record.EmployeeID = (int)cmbEmployees.SelectedValue;
                record.ProjectID = (int)cmbProjects.SelectedValue;
                record.ClockIn = DateTime.Now;


                ctx.tblTimeRecords.Add(record);
                ctx.SaveChanges();

                update_cmbProjects_btClockIn();

            }
            else
            {
                tblTimeRecord record = (from r in ctx.tblTimeRecords
                                        where r.EmployeeID == (int)cmbEmployees.SelectedValue && !r.ClockOut.HasValue
                                        select r).FirstOrDefault();
                record.ClockOut = DateTime.Now;
                ctx.SaveChanges();

                update_cmbProjects_btClockIn();
            }
        }
    }

РЕДАКТИРОВАТЬ 1: Вот мой файл app.config (включая то, что выглядит как строка подключения)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <connectionStrings>
    <add name="TimeKeepEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\TimeKeep.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

person Mr1159pm    schedule 19.09.2012    source источник
comment
Ошибка вообще? (вышеупомянутое выглядит нормально для меня, поэтому я ставлю на то, что это как-то связано с вашей фактической строкой подключения или разрешениями)   -  person Not loved    schedule 20.09.2012
comment
нет, никаких ошибок. Я посмотрел на модель данных объекта в режиме отладки, и похоже, что данные сохраняются в модели, но не в базе данных.   -  person Mr1159pm    schedule 20.09.2012
comment
Вы уверены, что ищете правильную базу данных? EF часто создает базу данных, используя соглашение об именах, если вы его не укажете. Проверьте свои строки подключения, чтобы убедиться (вы также должны правильно назвать строку подключения, иначе она будет использовать значение по умолчанию).   -  person Erik Funkenbusch    schedule 20.09.2012
comment
Попробуйте запустить SqlProfiler и посмотрите, попадает ли команда sql в базу данных, о которой вы думаете. Или попробуйте EFProf.   -  person Dave Hogan    schedule 20.09.2012
comment
Спасибо, я попробую это.   -  person Mr1159pm    schedule 20.09.2012
comment
Можете ли вы показать нам свою строку подключения? Вы случайно не пользуетесь функцией AttachDbFileName=.....?   -  person marc_s    schedule 20.09.2012
comment
где я могу найти строку подключения? (я новичок в С#). Я добавил базу данных в проект с помощью мастера, если это то, о чем вы просите.   -  person Mr1159pm    schedule 20.09.2012
comment
@DaveHogan Не думаю, что у меня есть sqlProfiler. Я использую экспресс-выпуски sql и VS 2012 (оба.   -  person Mr1159pm    schedule 20.09.2012
comment
Вероятно, вы смотрите не на ту БД, как сказал @MystereMan. База данных подключается во время выполнения. В SQL Management Studio убедитесь, что файлы просматриваемой базы данных соответствуют App_Data/TimeKeep.mdf.   -  person André Pena    schedule 20.09.2012
comment
Я бы также установил точку останова в этом обработчике, чтобы убедиться, что этот код вызывается в первую очередь.   -  person Jay    schedule 20.09.2012


Ответы (1)


Как предположил ММ в комментариях, я также подозреваю, что вы впервые смотрите не на тот файл MDF. В случае с SQL Express эти мастера, как правило, делают его копии, и окончательная копия, которую использует приложение, иногда находится в другом месте, чем та, которая была создана мастером. Последний, который используется, обычно находится в папке App_Data вашего решения, но вы можете отследить его в Debug при сохранении изменений, чтобы быть уверенным.

Вот ответ на аналогичную проблему: Entity Framework 4.1 не добавляет строки в базу данных SQL Server Express

person Turnkey    schedule 20.09.2012
comment
Спасибо! Я использовал ssms для просмотра таблицы во время запуска кода, и действительно, записи были добавлены. Как описано в этой связанной проблеме, копирование mdf с помощью VS каждый раз заменяло базу данных, и поэтому я не видел никаких данных. Спасибо еще раз! - person Mr1159pm; 20.09.2012