使用EF 6和Devart Entity Design和DotConnect for 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(字符串 路径,ExtensionCheck extensionCheck,字符串有效扩展名, 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.Evaluate(TArg arg) 在 System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetArtifactLoader(DbConnectionOptions 的有效连接选项) System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetMetadataWorkspace(DbConnectionOptions 的有效连接选项) 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(字符串 connectionString,字符串defaultContainerName)位于 Model.Entities..ctor()在 ThermalVision.Form1.SetMachineTextBoxOptions()在 ThermalVision.Form1.Form1_Load(Object sender,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中的调试模式下以及在安装应用程序的产品中使用资源时,如何处理读/写嵌入式资源?
答案 0 :(得分:0)
该错误与ADO.NET连接无关,并且发生在EF级别。
错误原因可能是缺少“ .csdl”,“。ssdl”或“ .msl”文件。您在部署期间是否将这些文件与应用程序一起复制?
确认您部署的应用程序是在安装dotConnect for SQLite Professional的工作站上构建的。
尝试同时使用Metadata Artifact Processing模型属性https://forums.devart.com/viewtopic.php?t=30956#p106308的CopyToOutputDirectory和EmbedInOutputAssembly值来构建项目。这有什么区别吗?