实体框架 - 分层设计 - 将连接字符串放在哪里?

Posted

技术标签:

【中文标题】实体框架 - 分层设计 - 将连接字符串放在哪里?【英文标题】:Entity Framework - layered design - Where to put connectionstring? 【发布时间】:2010-10-25 23:22:04 【问题描述】:

我使用分层架构和实体框架作为我的数据层,顶部有一堆包含 Linq-To-Entities 查询的存储库。 数据层是一个项目,接下来我有一个服务层和接口,它是一个网站。

我希望我的网站负责为我的实体模型指定连接字符串。我该怎么做?

我正在使用单例方法访问我的实体存储库,该存储库位于数据层内。

谢谢

【问题讨论】:

【参考方案1】:

您可以将在 DAL 程序集的 App.Config 中创建的连接字符串复制到 web.config 的 connectionStrings 部分。

您可以将连接字符串保留在程序集 dll 中,但不应将其与网站一起部署。

您需要复制整个连接字符串。它应该是这样的:

<add name="DataEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

它应该包括有关映射文件所在位置的所有信息。

【讨论】:

【参考方案2】:

就我而言,虽然我使用的是 L2S 而不是 L2E,但建议应该成立。我有一个从 XML 文件提供的通用配置库。当需要数据上下文时,每个数据对象都有如下方法。当然,如果您愿意,可以很容易地对其进行模板化。

private static string _conStr = null;
private static CalendarsAndListsDataContext GetDataContext()

    if (_conStr == null)
    
        _conStr = ConfigurationLibrary.Config.Settings().GetConnectionString("liveConString");
    

    return new CalendarsAndListsDataContext(_conStr);

现在,最大的缺点是连接字符串更改需要重新启动应用程序,但在我的情况下,这不是问题。

【讨论】:

我喜欢你如何在一个额外的项目中分离你的配置的想法。但是对于这个应用程序,我希望我的网站负责连接字符串。 好吧,你的配置层没有理由必须是只读的。你可以让它读/写,所以你可以做一些像 COnfigurationLibrary.Config.AddSetting("ConnectionString","MyString") 的事情。那么您的网站仍然可以驱动连接字符串。

以上是关于实体框架 - 分层设计 - 将连接字符串放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

具有分层 Web 应用程序的实体框架

我应该如何编辑实体框架连接字符串?

将数据库代码移动到单独的程序集时将连接字符串放在哪里

测试驱动设计和分层架构

.net Core 的实体框架 6。在 Blazor 服务器端

将实体框架连接字符串转换为 SQL Server Express