SQL Metal для определенных таблиц или другой способ обновить / добавить таблицу в файл.dbml
У кого-нибудь есть простой способ сделать это в Visual Studio, без использования обозревателя сервера?
Я пытался также смотреть на макро, но запись только производит
Sub TemporaryMacro()
End Sub
Так что не повезло.
Есть ли способ написать это?
3 ответа
SqlMetal Include работал как шарм для меня. Сначала создайте полный dbml-файл, используя SqlMeta - скажем, testComplete.dbml
Теперь предоставьте этот файл в качестве входных данных для SqlMetaInclude SqlMetalInclude /dbml:"testComplete.dbml" /output:"testSubSet.dbml" /include:dbo.SampleTable1=SampleTable1,dbo.SampleTable2=SampleTable2
Обратите внимание, что этот инструмент имеет графический интерфейс, который может обрабатывать весь процесс.
Я использую пакетный скрипт, аналогичный этому, для управления обновлением моих моделей при изменении базовых таблиц / представлений. Чтобы использовать это:
- Иметь SQLMetal и SQLMetalInclude (вам, возможно, придется загружать и создавать из исходного кода) доступ из текущего каталога (или по пути)
- Создайте файл selectedEntities.txt с именем таблицы / представления в каждой строке. Эти таблицы будут единственными, для которых генерируется код.
- Изменить, сохранить и выполнить пакетный код Generate.bat
- (Необязательно) Добавьте файл.bat в качестве инструмента внешнего запуска в Visual Studio, как описано здесь.
Generate.bat:
sqlmetal /conn:"Data Source={Hostname};Initial Catalog={DBName};User ID={Username};Password={Password}" /dbml:temp.dbml /views
setlocal EnableDelayedExpansion
set file=chosenEntities.txt
set include=
FOR /F %%i IN (%file%) DO (
set include=!include!%%i,
)
set include=%include:~0,-1%
sqlmetalinclude -dbml:temp.dbml -output:ChosenEntities.dbml -include:%include%
sqlmetal /context:CustomDataContext /pluralize /namespace:MyNamespace.DB /language:csharp /code:DBEntities.cs /entitybase:DBEntityBase ChosenEntities.dbml
пример selectedEntities.txt:
Accounts
Customers
PRODUCTS_VIEW
AnotherTable
Объяснение:
- Промежуточный файл.dbml генерируется sqlmetal как обычно. Созданный dbml-файл содержит определения для каждой таблицы в базе данных (и представления, если они выбраны)
- Следующий блок кода перебирает selectedEntities.txt, и к каждой строке добавляется содержимое строки (имя таблицы) плюс запятая ','
- Последняя запятая удаляется
- Запустите sqlmetalinclude, которое в основном создает копию исходного файла temp.dbml, но только с указанными вами таблицами. Доступны и другие варианты, например преобразование имен отдельных таблиц.
- sqlmetal запускается второй раз, на этот раз генерируя фактический код.cs на основе сокращенного файла.dbml.
Существует одна хорошая утилита, которая поможет вам обновить существующие файлы DBML из базы данных: инструменты Huagati DBML/EDMX.
Это не бесплатно, но стоит вложений для любой серьезной разработки Linq-to-SQL.
Единственная альтернатива - написать ее самостоятельно - прочитать структуру базы данных и сравнить ее с представлением XML в DBML, а также обновить DBML по мере необходимости.