Указанный путь метаданных недействителен после установки приложения - PullRequest
0 голосов
/ 29 марта 2019

Использование EF 6 и Devart Entity Design и DotConnect для SQLite. У меня проблемы с расположением встроенной базы данных при выполнении отладки, выпуска и после установки.

Он прекрасно работает, чтобы скопировать файл базы данных в bin / Debug или bin / release и получить доступ к базе данных, используя:

Data Source=database.db

в моей строке подключения. Когда я запускаю во время отладки, я могу получить доступ к базе данных очень хорошо. Если я установил, я не могу получить доступ к базе данных с возможностью чтения / записи - только чтение.

Итак ... Я заставил приложение убедиться, что база данных (и несколько других ресурсов доступны в каталоге пользователя \ AppData \ Roaming), запустив это при загрузке формы:

        string basePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\ThermalVision\";

        //Later...

            if(!File.Exists(basePath + "database.db"))
        {
            string source = AppDomain.CurrentDomain.BaseDirectory + "database.db";
            File.Copy(source, basePath + "database.db");
        }

Это также хорошо работает при работе в режиме отладки внутри Visual Studio.

Моя строка подключения метаданных в настоящее время выглядит следующим образом (код генерируется Entity Developer):

    public Entities() : 
        base(@"metadata=DataModel1.csdl|DataModel1.ssdl|DataModel1.msl;provider=Devart.Data.SQLite;provider connection string=""Data Source=C:\Users\erics\AppData\Roaming\ThermalVision\database.db;FailIfMissing=False""", "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

Когда это приложение установлено и я запускаю, я получаю следующую ошибку:

System.Data.Entity.Core.MetadataException: указанный путь метаданных не является действительным. Допустимый путь должен быть либо существующим каталогом, существующий файл с расширением .csdl, .ssdl или .msl или URI который идентифицирует встроенный ресурс. в System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoader.Create (String путь, ExtensionCheck extensionCheck, String validExtension, ICollection 1 uriRegistry, MetadataArtifactAssemblyResolver resolver) at System.Data.Entity.Core.Metadata.Edm.MetadataCache.SplitPaths(String paths) at System.Data.Entity.Core.Common.Utils.Memoizer 2. <> C__DisplayClass2.b__0 () в System.Data.Entity.Core.Common.Utils.Memoizer 2.Result.GetValue()<br> at System.Data.Entity.Core.Common.Utils.Memoizer 2.Evaluate (TArg arg) в System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetArtifactLoader (DbConnectionOptions ffectiveConnectionOptions) в System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetMetadataWorkspace (DbConnectionOptions ffectiveConnectionOptions) в System.Data.Entity.Core.EntityClient.EntityConnection.GetMetadataWorkspace () в System.Data.Entity.Core.Objects.ObjectContext.RetrieveMetadataWorkspaceFromConnection () в System.Data.Entity.Core.Objects.ObjectContext..ctor (EntityConnection соединение, логическое значение isConnectionConstructor, ObjectQueryExecutionPlanFactory objectQueryExecutionPlanFactory, Переводчик-переводчик, ColumnMapFactory columnMapFactory) в System.Data.Entity.Core.Objects.ObjectContext..ctor (String connectionString, String defaultContainerName) в Model.Entities..ctor () в ThermalVision.Form1.SetMachineTextBoxOptions () в ThermalVision.Form1.Form1_Load (Отправитель объекта, EventArgs e) в System.Windows.Forms.Form.OnLoad (EventArgs e) в System.Windows.Forms.Form.OnCreateControl () в System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl () в System.Windows.Forms.Control.WmShowWindow (Message & m) в System.Windows.Forms.Control.WndProc (Message & m) в System.Windows.Forms.ScrollableControl.WndProc (Message & m) в System.Windows.Forms.Form.WmShowWindow (Message & m) в System.Windows.Forms.Form.WndProc (Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Сообщение & m) в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

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

Также кажется, что другой вопрос здесь заключается в том, как обрабатывать встроенные ресурсы для чтения / записи, когда ресурсы используются в режиме отладки в Visual Studio, и в продукте, когда приложение установлено?

1 Ответ

0 голосов
/ 04 апреля 2019

Ошибка не связана с соединением ADO.NET и возникает на уровне EF.

  1. Причиной ошибки могут быть отсутствие '.csdl', '.ssdl'или файлы .msl.Скопировали ли вы эти файлы вместе со своим приложением во время развертывания?

  2. Убедитесь, что развернутое приложение создано на рабочей станции, на которой установлено dotConnect для SQLite Professional.

  3. Попробуйте построить проект с использованием значений CopyToOutputDirectory и EmbedInOutputAssembly свойства модели обработки артефактов метаданных: https://forums.devart.com/viewtopic.php?t=30956#p106308. Имеет ли это какое-либо значение?

...