将 WCF 服务中使用的实体框架连接字符串包含到自托管控制台应用程序中的正确方法是啥?
Posted
技术标签:
【中文标题】将 WCF 服务中使用的实体框架连接字符串包含到自托管控制台应用程序中的正确方法是啥?【英文标题】:What's the proper way to include Entity Framework connection string used in WCF service into a self hosting console application?将 WCF 服务中使用的实体框架连接字符串包含到自托管控制台应用程序中的正确方法是什么? 【发布时间】:2019-05-24 06:42:49 【问题描述】:我正在做我的作业,一个 WCF 服务,它使用带有实体框架的 SQL Server,通过控制台应用程序托管,并使用 WPF 客户端。
有3个不同的项目,主机和服务在同一个解决方案中。我已将实体框架连接字符串包含在来自服务的web.config
文件的控制台主机的app.config
文件中。这样,当我尝试进行查询时,服务器和主机都会抛出异常:
System.Data.Entity.Core.EntityException: '底层提供程序在打开时失败。'
内部异常说:
SqlException:尝试为文件 C:\Users\username\source\repos\BlogAppWcf\BlogHost\bin\Debug\BlogDb.mdf 附加自动命名数据库失败。存在同名数据库,或指定文件无法打开,或位于 UNC 共享上。
所以它基本上在它自己的项目文件夹中搜索.mdf
文件,而它在服务的App_Data
文件夹中。
原来的连接字符串是这样的,我把这个从web.config
复制到主机的app.config
:
connectionString="metadata=res://*/BlogDbEntities.csdl|res://*/BlogDbEntities.ssdl|res://*/BlogDbEntities.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=(LocalDB)\MSSQLLocalDB;
attachdbfilename=|DataDirectory|\BlogDb.mdf;
integrated security=True;
MultipleActiveResultSets=True;App=EntityFramework""
我试过修改app.config
中的AttachDbFilename
属性,我给它一个绝对路径,如下:
attachdbfilename=C:\Users\username\source\repos\BlogAppWcf\BlogAppWcf\App_Data\BlogDb.mdf;
这样它就像一个魅力!查询不再有异常。
但这不是正确的做法,尤其是因为我必须将它发送给我的老师。我想给它一个相对路径,就像这样:
attachdbfilename=..\..\..\BlogAppWcf\App_Data\BlogDb.mdf;
但是这样不行。
有没有人有任何建议,也许我正在做或想一些完全错误的事情?
【问题讨论】:
你问过你的老师吗?我并不是说很难,只是他们比互联网上的一群陌生人更有可能有现成的答案。 【参考方案1】:根据您的描述和您遇到的问题,我认为问题归结为附加数据库未正确附加到VS内置数据库服务器实例的事实。出于这个原因,我认为我们可以使用 VS 内置的数据库实例字符串来配置 EntityFramework。
数据源=(localdb)\MSSQLLocalDB;初始目录=MyStore;集成 安全=真;连接 Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False
然后重写 DropCreateDatabaseAlways/DropCreateDatabaseIfModelChanges 类的种子方法来提供种子数据。 如果有什么我可以帮忙的,请随时告诉我。
【讨论】:
以上是关于将 WCF 服务中使用的实体框架连接字符串包含到自托管控制台应用程序中的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章