Как обновить файл Linq to SQL dbml?

Ответы:

258

Существует три способа синхронизации модели.

  1. Удалите измененные таблицы из конструктора и перетащите их обратно на поверхность конструктора из проводника баз данных. Я обнаружил, что для надежной работы необходимо:

    а. Обновите схему базы данных в Database Explorer (щелкните правой кнопкой мыши, обновите)
    b. Сохранить дизайнер после удаления таблиц
    c. Сохраните снова после перетаскивания таблиц обратно.

    Обратите внимание, что если вы изменили какие-либо свойства (например, отключив дочернее свойство ассоциации), это, очевидно, утратит эти изменения - вам придется их делать снова.

  2. Используйте SQLMetal для регенерации схемы из вашей базы данных. Я видел несколько постов в блоге, которые показывают, как это написать .

  3. Внесите изменения непосредственно в панели свойств DBML. Это работает для простых изменений, таких как разрешение пустых значений в поле.

Конструктор DBML не устанавливается по умолчанию в Visual Studio 2015, 2017 или 2019. Вам придется закрыть VS, запустить установщик VS и изменить установку. Инструменты LINQ to SQL - это функция, которую вы должны установить. Для VS 2017/2019 вы можете найти его в разделе « Отдельные компоненты»> «Инструменты кода» .

Роберт Харви
источник
1
Я пробовал 1a и 1c без 1b и получал ошибки «Указанное приведение неверно» при выполнении простого выбора в представлении. В том числе 1b исправил это для меня
tomfumb
6
Поддержка VS была предложена на connect.microsoft.com/VisualStudio/feedback/details/260723/... , но MS не хочет исправить.
Майкл Фрейдгейм
Попробовал первый способ и все заработало. Думаю, это будет работать для небольшой БД.
Мухаммед
Мне больно, что в конце 2019 года мне был нужен ответ, прежде чем я понял, что такое компьютерное программирование ... Это так подробно и здорово!
PSGuy
54

Чтобы обновить таблицу в .dbml-диаграмме, например, добавив столбцы, сделайте следующее:

  1. Обновите окно проводника SQL Server.
  2. Перетащите «новую» версию вашей таблицы в .dbml-диаграмму (report1 на рисунке ниже).

report1 - новая версия таблицы

  1. Отметьте добавленные столбцы в новой версии таблицы, нажмите Ctrl+, Cчтобы скопировать добавленные столбцы.

скопировать добавленные столбцы

  1. Нажмите «старую» версию таблицы и нажмите « Ctrl+», Vчтобы вставить добавленные столбцы в уже существующую версию таблицы.

вставьте добавленные столбцы в старую версию таблицы

M463
источник
4
Кажется, это самый простой, наименее разрушительный метод, который не требует дополнительных инструментов и прекрасно работает в VS2017
Toby
1
Это гораздо менее навязчиво, чем принятый ответ, и продолжает хорошо работать в конце 2018 года!
Марк
1
Это лучший ответ для быстрого (и не очень быстрого редактирования схемы). Я потратил много времени, чтобы внешний вид модели выглядел красиво. Я ненавидел удалять и перетаскивать файлы обновлений. Для добавленных полей это прекрасно работает!
Хакер
1
Для меня это решило две проблемы. Первый - когда я попытался скопировать и вставить аналогичное поле в таблицу, а затем переименовать его. Это создало безостановочную «неопределенную» ошибку сборки при проверке. Другая проблема заключалась в том, что если я удалил таблицу, а затем добавил ее полностью, это привело к гораздо большим различиям в git (поскольку объекты были перегруппированы в файле). С помощью этого метода я вижу только вставку нового поля, которое намного чище и легче для понимания позже.
Goug
Кстати, нужно нажать «Да», когда он предлагает «Объекты, которые вы добавляете в конструктор, используют подключение к данным, отличное от конструктора ...»
Eitanmg
5

Вы также можете ознакомиться с набором шаблонов генерации кода PLINQO , основанных на CodeSmith, которые позволяют вам делать много полезных вещей для Linq-to-SQL:

  • генерировать один файл на класс (вместо одного огромного файла)
  • обновить вашу модель по мере необходимости
  • много других функций

Посетите сайт PLINQO по адресу http://www.plinqo.com и посмотрите вступительные видеоролики.

Второй инструмент, который я знаю, это инструменты Huagati DBML / EDMX , которые позволяют обновлять файлы отображения DBML (Linq-to-SQL) и EDMX (Entity Framework) и многое другое (например, соглашения об именах и т. Д.).

Марк

marc_s
источник
Только что вырвали CodeSmith / PLINQO Я настоятельно советую против принятия такого подхода. Допустим, этот ответ старше 4 лет ...
Yuck
@Yuck: на данный момент я настоятельно рекомендую вообще не использовать Linq-to-SQL - используйте Entity Framework вместо этого, гораздо лучший выбор!
marc_s
Да, это так. Переход к EF после проверки того, что приложение будет работать с простым DBML вместо PLINQO, был следующим шагом, который я предпринял, чтобы стереть старое приложение.
Yuck
4

Мы используем специально написанный шаблон T4, который динамически запрашивает модель information_schema для каждой таблицы во всех наших файлах .DBML, а затем перезаписывает части файла .DBML свежей информацией о схеме из базы данных. Я высокорекомендую внедрить подобное решение - оно сэкономило мне кучу времени, и в отличие от удаления и повторного добавления таблиц в модель, вы сохраняете ассоциации. С этим решением вы получите ошибки во время компиляции, когда ваша схема изменится. Вы хотите убедиться, что используете систему контроля версий, потому что diffing действительно удобен. Это отличное решение, которое хорошо работает, если вы разрабатываете сначала схему БД. Конечно, я не могу поделиться кодом моей компании, поэтому вы сами пишете это. Но если вы знаете какой-нибудь Linq-to-XML и можете пойти в школуВ этом проекте вы можете попасть туда, где хотите.

mattmc3
источник
2

Я бы порекомендовал использовать визуальный конструктор, встроенный в VS2008, так как обновление dbml также обновляет сгенерированный для вас код. Изменение dbml вне визуального конструктора приведет к несинхронизации основного кода.

Джейсон Месьончек
источник
4
Да, но визуальный дизайнер в VS2008 не может обнаружить и отреагировать на изменения в вашей базовой базе данных :-( За исключением удаления и повторного добавления, нет поддержки для обновления вашей модели :-(
marc_s
Хотя это правда, вопрос был очень расплывчатым, и в нем конкретно не упоминалось, как обновить модель при изменении базы данных.
Джейсон Miesionczek
2

Есть нюанс обновления таблиц и последующего обновления DBML ... Связи с внешним ключом не всегда переносятся сразу, если в существующие таблицы вносятся изменения. Обходной путь - сделать сборку проекта, а затем снова добавить таблицы. Я сообщил об этом MS, и это было исправлено для VS2010.

Дисплей DBML не показывает новые ограничения внешнего ключа


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

  1. Раскройте поверхность дизайна DBML
  2. Выделите все таблицы правой кнопкой мыши -> Нажмите -> Выбрать все или CTRLa
  3. CTRLx (Резать)
  4. CTRLv (Вставить)
  5. Сохраните и восстановите решение.
ΩmegaMan
источник
Я не верю, что это исправлено, потому что связанное connect.microsoft.com/VisualStudio/feedback/details/414601/… не исправлено
Майкл Фрейдгейм
Вносите ли вы свои изменения до или после вырезания и вставки?
каньон Колоб
Прошло 10 лет ... но я считаю, что это было раньше ... внесите изменения, затем перейдите к # 2.
ΩmegaMan
1

В случае обновления хранимой процедуры вы должны удалить ее из файла .dbml и заново вставить ее. Но если хранимая процедура имеет два пути (например: если что-то; отображать некоторые столбцы; еще отображать некоторые другие столбцы), убедитесь, что два пути имеют одинаковые псевдонимы столбцов !!! В противном случае будут существовать только первые столбцы пути.

Ясир Хосни Абу Эльмакарем
источник
0

Вот полный пошаговый метод, который работал для меня, чтобы обновить LINQ to SQL dbml и связанные файлы, чтобы включить новый столбец, который я добавил в одну из таблиц базы данных.

Вы должны внести изменения в вашу поверхность дизайна, как предложено другими выше; Тем не менее, вам нужно сделать несколько дополнительных шагов. Это полные шаги:

1. Drag your updated table from Server Explorer onto the design surface

2. Copy the new column from this "new" table to the "old" table (see M463 answer for details on this step)

3. Delete the "new" table that you just dragged over

4. Click and highlight the stored procedure, then delete it

5. Drag the new stored procedure and drop into place.

6. Delete the .designer.vb file in the code-behind of the .dbml 
   (if you do not delete this, your code-behind containing the schema will
    not update even if you rebuild and the new table field will not be included)

7. Clean and Rebuild the solution (this will rebuild the .designer.vb file to include all the new changes!).
Джефф
источник