【问题标题】:SQLite with Entity Framework 6: relative path?SQLite 与实体框架 6:相对路径?
【发布时间】:2017-11-06 09:54:23
【问题描述】:

我正在尝试在我的 WPF 应用程序中将 SQLite 与 Entity Framework 6 一起使用。当我在项目中创建实体数据模型时,我使用绝对路径连接到 *.db 文件,因为相对路径由于某种原因不起作用。所以我的连接看起来像

<connectionStrings>
    <add name="Model1ConnectionString" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SQLite.EF6;provider connection string='data source=&quot;C:\Users\gtmaster\Documents\Visual Studio 2017\Projects\SQLiteTest\SQLiteTest\test.db&quot;'" providerName="System.Data.EntityClient" />
</connectionStrings>

如果其他开发人员使用此连接克隆存储库,他会收到unable to open database file 错误,因为项目中test.db 的绝对路径在他的机器上明显不同。 如何在 app.config 中编写相对路径,以便实体模型无需每次都更改即可工作?

【问题讨论】:

    标签: visual-studio entity-framework sqlite


    【解决方案1】:

    使用数据库文件的相对路径

    db文件的来源在App.config中

    <add name="ProjectDBEntities" connectionString="metadata=res://*/ProjectDBModel.csdl|res://*/ProjectDBModel.ssdl|res://*/ProjectDBModel.msl;provider=System.Data.SQLite.EF6;provider connection string='data source=&quot;c:\Users\Heckl\Documents\Dropbox\Else\visual studio\SqLiteTry\ProjectDB.db&quot;'" providerName="System.Data.EntityClient"/>
    

    数据源必须是绝对的

    您可以使用 |DataDirectory| App.config 中的替换字符串

    <add name="ProjectDBEntities" connectionString="metadata=res://*/ProjectDBModel.csdl|res://*/ProjectDBModel.ssdl|res://*/ProjectDBModel.msl;provider=System.Data.SQLite.EF6;provider connection string='data source=&quot;|DataDirectory|ProjectDB.db&quot;'" providerName="System.Data.EntityClient"/>
    

    必须设置替换字符串

    string executable = System.Reflection.Assembly.GetExecutingAssembly().Location;            
    string path = (System.IO.Path.GetDirectoryName(executable));
    AppDomain.CurrentDomain.SetData("DataDirectory", path);  
    // ...
    var db = new ProjectDBEntities()
    

    问题:

    第一个 LINQ 命令出现异常

    VS 并不总是检测到 App.config 中的更改,您可能需要手动重建解决方案

    上面的代码设置了exe文件在solution\project\bin\debug文件夹中的位置

    db 文件在解决方案文件夹中

    在调试期间在监视窗口中检查 db.Database.Connection.ConnectionString 的值

    您也可以将 db 文件复制到调试文件夹中

    【讨论】:

      【解决方案2】:

      |DataDirectory| 适合生产环境,但是当您执行 update-database 迁移时,迁移适用于 EF 数据包目录中新创建的数据库,因为 EF 无法获取您的项目生成的连接字符串并使用自己的 DataDirectory 值。

      【讨论】:

        猜你喜欢
        • 2014-07-28
        • 2013-12-26
        • 1970-01-01
        • 2010-10-30
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多