Проблема обновления таблиц в конструкторе LINQ to SQL - PullRequest
10 голосов
/ 06 декабря 2008

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

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

Ответы [ 9 ]

7 голосов
/ 07 декабря 2008

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

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

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

3 голосов
/ 07 декабря 2008

Это невозможно при использовании конструктора VS linq to 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/

1 голос
/ 21 октября 2010

У меня есть похожий комментарий, я думаю, что он может подойти всем, кто ищет решение этой проблемы ...

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

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

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

Я думаю, это квалифицируется как боль в синей ленте в попе У кого-нибудь есть более простое решение?

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

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

1 голос
/ 09 декабря 2008

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

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

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

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

1 голос
/ 07 декабря 2008

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

0 голосов
/ 06 декабря 2008

Есть несколько других вариантов:

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

Есть шаблон для VS 2008, который заменяет конструктор, он должен облегчить обновление ваших классов LINQtoSQL: http://damieng.com/blog/2008/09/14/linq-to-sql-template-for-visual-studio-2008

0 голосов
/ 06 декабря 2008

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

Я в основном использую 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+ таблиц, это не могло бы быть вариантом;)

0 голосов
/ 06 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...