DbContext SaveChanges

1

Я относительно новичок в С# и очень новичок в WPF. Я пытаюсь обернуть голову концепцией MVVM, и теперь я превратил ADO Entity в микс.

Цель моего примера приложения - отслеживать элементы САПР. Я вытаскиваю элементы из базы данных и успешно заполняю свое мнение; Великий. Я добавил информацию вручную, чтобы проверить, что представления работают так, как они должны быть.

Я теперь из моего приложения, пытающегося добавить новый элемент через функцию, которую я запускаю из своей ICommand. Насколько я понимаю, я создаю новый объект DBContext, добавляя к нему элемент и сохраняя свои изменения. Выполнение "SaveChanges()" успешно сообщает мне, что 1 строка была обновлена, но когда я проверяю, данных нет? В дополнение к этому, если я снова вызову SaveChanges() (в том же сеансе отладки), он выдает ошибку, указывающую на наличие нескольких записей. Опять же, при просмотре данных через "Показывать данные таблицы" я ничего не вижу.

    public void AddNewItem(object parameter)
    {
        using (var dbq = new DBEntities()) {
            var tempItem = dbq.OutstandingCAD.Create();
            tempItem.Id = 2;
            dbq.OutstandingCAD.Add(tempItem);
            dbq.SaveChanges();
        }

    }

Может кто-то, пожалуйста, просмотрите этот небольшой блок кода и предположите, правильно ли я делаю, и что моя проблема лежит где-то в другом месте?

Очень признателен

  • 0
    Когда вы создаете объект из базы данных, это связанный объект. Таким образом, вызов Add пытается вставить его снова. Отсюда и ошибка. Вы можете удалить строку Add и просто сохранить.
  • 0
    какую технологию баз данных вы используете? полноценный сервер SQL? экземпляр SQL Express? встроенный в LocalDb?
Показать ещё 2 комментария
Теги:
entity-framework
wpf

1 ответ

0
Лучший ответ

Ваша проблема связана не с вашим кодом, а с тем, как вы пытаетесь оценить вашу работу.

Существует изделие для Microsoft здесь, которая обсуждает ситуацию с которой вы столкнулись. Он ссылается на Visual Studio 2005, но он по-прежнему имеет значение.

В основном, ваша база данных является файлом .mdf который хранится в вашем проекте. ваша строка SQL-соединения похожа на AttachDbFileName=|DataDirectory|\data.mdf".

Одна из вещей, которые нужно знать при работе с локальными файлами базы данных, заключается в том, что они рассматриваются как любые другие файлы содержимого. Для настольных проектов это означает, что по умолчанию файл базы данных будет копироваться в выходную папку (aka bin) каждый раз, когда будет создан проект. После F5, вот что он будет выглядеть на диске

MyProject\Data.mdf
MyProject\MyApp.vb
MyProject\Bin\Debug\Data.mdf
MyProject\Bin\Debug\MyApp.exe

Во время разработки MyProject\Data.mdf используется инструментами данных. Во время выполнения приложение будет использовать базу данных в выходной папке. В результате копирования многие люди создают впечатление, что приложение не сохраняет данные в файле базы данных. Фактически, это просто потому, что есть две копии файла данных. То же самое относится при просмотре схемы/данных через проводник базы данных. Инструменты используют копию в проекте, а не ту, что находится в папке bin.

По сути, у вас есть 2 копии вашей базы данных, одна для времени разработки, одна для времени выполнения. Вы просматриваете базу данных времени разработки и не видите изменений, которые были внесены в базу данных времени выполнения. Тем не менее, каждый раз, когда вы запускаете проект, база данных времени выполнения перезаписывается, поэтому может появиться впечатление, что ваши изменения исчезнут. Это действительно функция отладки, чтобы у вас не было сотни строк в базе данных из нескольких тестов одной и той же функции. Однако некоторые люди предпочитают такую настойчивость и будут использовать внешний экземпляр SQL вместо проекта, содержащего .mdf.

  • 0
    Клэйс, я понятия не имел, что такое поведение происходит за закрытыми дверями. Большое спасибо, что нашли время ответить и помочь мне разобраться в этом!
  • 0
    если это помогло вам решить вашу проблему, рассмотрите возможность голосования «против» и / или принятия ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню