Ваш результат разработки должен быть не двоичным файлом базы данных (файл .MDF), а сценарием развертывания. Вы относитесь к развертыванию и обновлению базы данных так же, как и к любому другому исходному файлу, ставите его под контроль исходного кода, проверяете рецензирование кода при регистрации и т. Д. И т. Д. Прямое изменение .MDF, а затем реверс-инжиниринг для его развертывания просто плохо. Проблема, с которой вы столкнулись сейчас, является лишь одной из проблем, и есть еще много проблем, особенно в отношении изменений схемы проблем, выполненных во время обновления версии приложения. См. Контроль версий и ваша База данных .
Теперь верно, что весь набор инструментов VS пытается увести вас по пути «просто отредактируйте свой MDF в VS Database Explorer, и все будет хорошо». Ничего не будет хорошо, и один или несколько крахов развертывания просто впереди в вашей жизни, но давайте представим, что VS делает хорошие вещи.
Вы можете автоматизировать извлечение текущей схемы и ее развертывание с помощью сторонних коммерческих инструментов, таких как SQL Compare от Red Gate, или вы можете довольно легко создавать свои собственные «Сгенерировать сценарии». SSMS все, что он делает, вызывает возможности сценариев SMO для создания сценариев для всей базы данных. Вы можете сделать то же самое: создать экземпляр объекта Scripter
, затем добавить к нему объекты, которые вы хотите создать в сценарии, и затем извлечь сценарий, сгенерированный T-SQL. Это в точности , что делает «Генерация скриптов» в SSMS. В MSDN есть пример для сценариев :
//Connect to the local, default instance of SQL Server.
Server srv = new Server();
//Reference the AdventureWorks2008R2 database.
Database db = srv.Databases["AdventureWorks2008R2"];
//Define a Scripter object and set the required scripting options.
Scripter scrp = new Scripter(srv);
scrp.Options.ScriptDrops = false;
scrp.Options.WithDependencies = true;
//Iterate through the tables in database and script each one. Display the script.
//Note that the StringCollection type needs the System.Collections.Specialized namespace to be included.
Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] smoObjects = new Microsoft.SqlServer.Management.Sdk.Sfc.Urn[1] ;
foreach (Table tb in db.Tables) {
smoObjects[0] = tb.Urn;
if (tb.IsSystemObject == false) {
System.Collections.Specialized.StringCollection sc;
sc = scrp.Script(smoObjects);
foreach ( string st in sc) {
Console.WriteLine(st);
}
}
}