SQLite with Entity Framework 6:相对路径



我正在尝试在我的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:UsersgtmasterDocumentsVisual Studio 2017ProjectsSQLiteTestSQLiteTesttest.db&quot;'" providerName="System.Data.EntityClient" />
</connectionStrings>

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

使用 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:UsersHecklDocumentsDropboxElsevisual studioSqLiteTryProjectDB.db&quot;'" providerName="System.Data.EntityClient"/>

数据源必须是绝对的

您可以使用 |数据目录|应用程序配置中的替换字符串

<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 文件在解决方案\项目\bin\debug 文件夹中的位置

数据库文件位于解决方案文件夹中

检查数据库的值。调试期间监视窗口中的数据库.连接.连接字符串

您也可以将数据库文件复制到调试文件夹中

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

最新更新