所有连接的应用程序都需要实体框架连接字符串

Posted

技术标签:

【中文标题】所有连接的应用程序都需要实体框架连接字符串【英文标题】:Entity Framework connection string required in all connected applications 【发布时间】:2021-11-25 17:45:30 【问题描述】:

我正在为一家汽车租赁公司构建一个包含多个应用程序的系统。所有都应该连接到同一个数据库。将有 Web 应用程序 (ASP.NET)、通用 Windows 应用程序 (WPF) 和用于停车场检查员的 Xamarin 应用程序。

我决定从一个类库项目开始,使用实体框架(代码优先)创建数据库,并执行数据验证,然后将其作为 NuGet 包发布到内部 NuGet 服务器上,然后将其安装在所有三个应用程序中执行 CRUD 操作。

在我的代码中,我在类库项目的App.config 文件中设置了连接字符串。

<connectionStrings><add name="ZoomAutoModel" connectionString="DATA SOURCE=localhost:1521/pdbd; PASSWORD=dummyPassword; PERSIST SECURITY INFO=True; USER ID=dummyUserId" providerName="Oracle.ManagedDataAccess.Client" /></connectionStrings>

然后我创建了一个EntryPoint 项目来在发布之前测试我的类库,我一直收到以下错误:

System.ArgumentException: 'Connection string was not in a correct format'

我确保我在 EntryPoint 项目的引用中有库,让它运行的唯一方法是将连接字符串从类库项目复制到 EntryPoint 项目中。

只是为了测试,我发布了一个 NuGet 包并尝试将其安装在一个完全独立的解决方案中,但我一直收到相同的错误,直到我将连接字符串复制到其 App.config

我的错误在哪里?我不想在所有应用程序的配置文件中提供连接字符串。

我像这样在 DbContext 构造函数中引用连接字符串

public ZoomAutoModel() : base("ZoomAutoModel")


【问题讨论】:

data source=localhost; DATA SOURCE=localhost:1521/pdbd; ???错误提示连接字符串错误 类库的配置文件没有编译到库dll中,因此在引用时不会跟随库到其他解决方案。如果您希望连接字符串跟随您的库,则需要在其他地方定义它。 将连接字符串硬编码到库中是个坏主意。您必须以一种或另一种方式更改该连接字符串。服务器很可能会发生变化——大多数应用程序不会在与数据库相同的服务器上运行。密码会改变。用户也会如此。在生产环境中使用 Windows 帐户的可能性要大得多,因此即使是 User IDPassword 关键字也会发生变化 在类库中设置连接字符串确实不是个好主意。根据@PanagiotisKanavos 的评论,最终(可能是几年后),该连接字符串将不得不改变。然后,您将不得不更新每个引用此库的应用程序中的引用(可能会进行重大更改)。如果您必须走这条路,我建议您使用自定义设置库,该库引用存储在内部网络安全位置的全局设置文件,或者如果所有应用程序将在同一台机器上运行,则该机器上的某个位置。跨度> 移动连接也非常不稳定。移动应用程序很少直接连接到数据库。通常,它们使用队列、消息传递协议和同步,因此它们不必直接连接。当他们确实连接到数据库时,他们的行为非常不同 - 他们不那么健谈,并尝试尽可能多地下载/上传,因此如果他们以后失去连接也不会受到影响跨度> 【参考方案1】:

所有都应该连接到同一个数据库。将有 Web 应用程序 (ASP.NET)、通用 Windows 应用程序 (WPF) 和用于停车场检查员的 Xamarin 应用程序。

这永远行不通,或者至少不安全也不可扩展。

您需要一个中间人,即一个 Web API 服务,所有应用程序都向其发送请求,并具有独立于 SQL Server 身份验证的单独身份验证机制(只有您的 API 知道)。

如果您让您的(移动)应用程序直接连接到您的数据库,那么您的用户也可以这样做,无论您是否信任他们。您还必须向世界公开您的数据库,并且公开它,包括您的所有用户、订单、收入......

回到绘图板,是的。

您的实际问题的答案是应用程序仅使用其自己的配置文件,而不是其任何依赖项的配置文件。

【讨论】:

然后是连接问题。移动连接根据定义是不稳定的,即使通过 WiFi 也是如此。我自己家的 WiFi 最近不稳定。建立数据库协议时假设与服务器的连接稳定,或者至少与云服务器的连接是半稳定的。

以上是关于所有连接的应用程序都需要实体框架连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 POCO 模板获取实体框架的连接字符串

实体框架,多个 edmx 共享连接字符串 - 可能吗?

实体框架错误关键字不支持:提供程序\r\n连接字符串

实体框架代码首先忽略连接字符串,而不是使用IIS

实体框架核心 1.1.1 为连接字符串引发 ArgumentNullException

App.Config 中的实体框架连接字符串