我正在尝试在我的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="C:UsersgtmasterDocumentsVisual Studio 2017ProjectsSQLiteTestSQLiteTesttest.db"'" 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="c:UsersHecklDocumentsDropboxElsevisual studioSqLiteTryProjectDB.db"'" 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="|DataDirectory|ProjectDB.db"'" 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
值。