Использование 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, и в продукте, когда приложение установлено?