安装应用

时间:2019-03-29 19:20:19

标签: c# entity-framework-6 devart

使用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.Memoizer 2.Result.GetValue()
at System.Data.Entity.Core.Common.Utils.Memoizer
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)
  在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中的调试模式下以及在安装应用程序的产品中使用资源时,如何处理读/写嵌入式资源?

1 个答案:

答案 0 :(得分:0)

该错误与ADO.NET连接无关,并且发生在EF级别。

  1. 错误原因可能是缺少“ .csdl”,“。ssdl”或“ .msl”文件。您在部署期间是否将这些文件与应用程序一起复制?

  2. 确认您部署的应用程序是在安装dotConnect for SQLite Professional的工作站上构建的。

  3. 尝试同时使用Metadata Artifact Processing模型属性https://forums.devart.com/viewtopic.php?t=30956#p106308的CopyToOutputDirectory和EmbedInOutputAssembly值来构建项目。这有什么区别吗?