Использование 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, 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.Memoizer2.Result.GetValue()
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)
at System.Data.Entity.Core.Common.Utils.Memoizer
в 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 и в продукте, когда приложение установлено?