Проблема обновления таблиц в конструкторе LINQ to SQL

Я некоторое время использую LINQ to SQL, и есть одна вещь, которая всегда беспокоила меня. Всякий раз, когда я изменяю схему таблицы, чтобы обновить ее в дизайнере, я должен удалить ее, а затем добавить ее обратно. Это прекрасно, но это означает, что мне нужно найти таблицу в дизайнере. У меня в моей базе около 100 таблиц, и каждый раз, когда я это делаю, мне нравится искать иглу в стоге сена. Ну, может быть, это не так уж плохо, но серьезно, это занимает больше времени, чем нужно.

Есть ли еще одна опция для обновления таблиц, о которых я не знаю?

Ответ 1

Некоторые люди используют SqlMetal для 'обновления/обновления' своего конструктора Linq2Sql. Дизайнер не поддерживает обновление схемы при изменении БД. Вам нужно вручную удалить таблицу и снова добавить ее обратно.

ADO Entity Framework, я могу обновить. Я не использовал его, но я думаю, что видел это в демонстрации TechEd в этом году.

Полезная информация: результаты Google для SqlMetal.

Ответ 2

Это невозможно с помощью конструктора VS linq для sql.

Вы можете сделать это, используя инструмент LLBLGEN PRO, сторонний инструмент, а не встроенный конструктор linq to sql. Он не является бесплатным, но он также делает массу других вещей, которые, конечно, вам могут понадобиться или не понадобиться.

LLBLGEN PRO на самом деле представляет собой полный набор инструментов ORM, но также включает усовершенствованный конструктор linq-to-sql с функциональностью "обновить модель из SQL".

См. здесь описание проблемы - http://weblogs.asp.net/fbouma/archive/2008/05/01/linq-to-sql-support-added-to-llblgen-pro.aspx И здесь для инструмента - http://www.llblgen.com/

Ответ 3

Я не делаю никакой настройки содержимого в дизайнере, поэтому после изменения таблицы я просто нажал CTRL + A, а затем DEL. Затем сдвиньте - выберите все мои таблицы и удалите их обратно в конструктор. У меня нет 100 столов, но я не уверен, что в какой-то момент ситуация замедляется, но с 20 + таблицами это займет всего секунду.

Ответ 4

Я написал надстройку, которая может это сделать (в обоих направлениях: база данных → DBML или DBML- → SQL-DDL diff script).

В отличие от SQLMetal (или модели обновления EF из базы данных), упомянутой в другом ответе, надстройка выполняет истинную синхронизацию/обновление; применяя изменения, соответствующие только различиям между моделью и базовым db.

Это означает, что любые настройки (переименованные свойства/свойства навигации и т.д.), которые вы сделали в других областях вашей модели, не будут удалены/перезаписаны, если они не конфликтуют с базовой схемой db. (в этом случае вы все равно можете сохранить их, добавив их в надписью "исключение" )

Вы можете скачать его и получить бесплатную 30-дневную пробную лицензию от http://www.huagati.com/dbmltools/

Ответ 5

У меня есть аналогичный комментарий, который, по его мнению, может поместиться здесь, для кого-то там Googling решение этой проблемы...

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

Я попытался отключить БД в проводнике сервера, даже удалив и повторно добавив соединение.

Единственное решение, которое я нашел, это: 1. Удалите SP от дизайнера. 2. Сохраните файл dbml (или все решение, что угодно) 3. Полностью закрыть Visual Studio. 4. Откроем Visual Studio и ваше решение. 5. Повторно добавьте хранимую процедуру к конструктору.

Я думаю, что это признак боли в синей ленте в крупу. Кто-нибудь получил более простое решение?

PS- Для тех из вас, у кого есть 100 + столов: Go получите реальный (реальный == зрелый) инструмент ORM. Я лично проголосую за NetTiers. Это круто. Используется в течение многих лет без жалоб (или, по крайней мере, очень мало). Вероятно, вам придется покупать CodeSmith, чтобы эффективно использовать его, но это того стоит. Шаблоны с открытым исходным кодом. И есть шаблоны для nHibernate. Но я обнаружил, что на самом деле я не разбираюсь в портах Java. Если я собираюсь закодировать на платформах MS, я хочу, чтобы там был "рожден" код...

... редакция завершена.: P

Ответ 6

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

Ответ 8

Есть еще несколько вариантов:

  • Отредактируйте файл .dbml, который дизайнер использует для рисования таблиц и создания кода. Я использовал этот подход, когда изменения были небольшими (добавив пару столбцов, создав простую таблицу).
  • Используйте sqlmetal для создания требуемого xml для измененных таблиц и перемещения деклараций вручную в файл .dbml. Это лучше, когда изменения являются более сложными или большими.

Ответ 9

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

В основном я использую LINQ для очень простого CRUD (нет связанных объектов или чего-то еще), и если это произойдет с вами, возможно, стоит отклониться от конструкторского костыля. Тем более, что определение объектов LINQ-to-SQL так же просто:

[Table("dbo.my_table")]
public class MyTable
{
[Column("id", AutoSync = AutoSync.OnInsert, IsDbGenerated = true, IsPrimaryKey = true)]
public Int32 Id { get; set; }

[Column("name", DbType="NVarChar(50) NOT NULL")]
public String Name { get; set; }
}

Таким образом, все ваши сущности имеют свои собственные файлы, что упрощает их поиск, хотя вам все равно придется добавлять/обновлять свойства вручную.

Конечно, если вы будете реорганизовывать более 100 таблиц, это может быть не вариант;)