Указанный путь к метаданным недействителен после установки приложения

Использование 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 path, ExtensionCheck extensionCheck, String validExtension, ICollection1 uriRegistry, MetadataArtifactAssemblyResolver resolver) at System.Data.Entity.Core.Metadata.Edm.MetadataCache.SplitPaths(String paths) at System.Data.Entity.Core.Common.Utils.Memoizer2.‹>c__DisplayClass2.b__0() в System.Data.Entity.Core.Common.Utils.Memoizer2.Result.GetValue()
at System.Data.Entity.Core.Common.Utils.Memoizer
2. Оценить (TArg arg) в System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetArtifactLoader(DbConnectionOptions EffectiveConnectionOptions) в System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetMetadataWorkspace(DbConnectionOptions EffectiveConnectionOptions) в System.Data. Entity.Core.EntityClient.EntityConnection.GetMetadataWorkspace() в System.Data.Entity.Core.Objects.ObjectContext.RetrieveMetadataWorkspaceFromConnection() в System.Data.Entity.Core.Objects.ObjectContext..ctor(соединение EntityConnection, Boolean 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(Message& m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) в System.Windows .Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

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

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


person Eric Snyder    schedule 29.03.2019    source источник


Ответы (1)


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

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

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

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

person Devart    schedule 04.04.2019