ASP.NET MVC 5 DACPAC Sql140DatabaseSchemaProvider недопустим - PullRequest
0 голосов
/ 06 февраля 2019

Я получаю эту ошибку при запуске dacpac из проекта VS Community 2017 MVC 5.

"Internal Error. The database platform service with type Microsoft.Data.Tools.Schema.Sql.Sql140DatabaseSchemaProvider is not valid. You must make sure the service is loaded, or you must provide the full type name of a valid database platform service."

Код

            var dacpacName = "setup.dacpac";                 
            var dacpacPath = Path.Combine(Server.MapPath("~/assets/dacpac"), dacpacName);
            var dp = DacPackage.Load(dacpacPath);
            var dbDeployOptions = new DacDeployOptions
            {
                BlockOnPossibleDataLoss = false,
                ScriptDatabaseOptions = false,
                GenerateSmartDefaults = true,
                CreateNewDatabase = true
            }; 
            var dbServices = new DacServices(setupDbConn.ConnectionString);
            dbServices.Deploy(dp, newDatabaseName, true, dbDeployOptions);

Ошибка возникает после этого кода:

var dbServices = new DacServices(setupDbConn.ConnectionString);

Мой SqlExpress 2017 года. Я также обновил dacpac из SqlExpress 2017.Dacpac работает без ошибок, когда я использую его в SqlExpress.

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

Надеюсь, что кто-то испытал это и может помочь мне решить эту проблему.

1 Ответ

0 голосов
/ 07 февраля 2019

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

Затем я прибег к другим способам вместо использования dacpac.Я создал скрипт для воссоздания всех таблиц и запускаю его.

Server myServer = new Server(serverName);

//Using windows authentication
bool integratedSecurity = Convert.ToBoolean(ConfigurationManager.AppSettings["integratedSecurity"]);    
myServer.ConnectionContext.LoginSecure = integratedSecurity;        
myServer.ConnectionContext.Connect();    

// check that database doesn't already exists
if (myServer.Databases.Contains(newDatabaseName))
{
    return new HttpStatusCodeResult(400, "Database has already been created");
}

//Define a Database object variable by supplying the server and the database name arguments in the constructor.   
Database db;
db = new Database(myServer, newDatabaseName);

//Create the database on the instance of SQL Server.   
db.Create();

string dbscript = System.IO.File.ReadAllText(Server.MapPath("~/assets/dbscript/createAllTables.sql"));    
myServer.Databases[newDatabaseName].ExecuteNonQuery(dbscript);
myServer.ConnectionContext.Disconnect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...