【问题标题】:Fetching EntityConnection string from app configuration file从应用配置文件中获取 EntityConnection 字符串
【发布时间】:2012-11-29 00:12:19
【问题描述】:

一些简单的问题:

所以我有这个LogInWindow 对话框,用于收集所有 SQL 登录信息,然后将构造的连接字符串传递给 ServiceManager.InitializeContext() 方法,该方法使用特定的提供程序连接初始化我的实体上下文。

一切正常。但我想用 App.config 配置文件中定义的值初始化LogInWindow 对话框。

是否有首选方法来执行此初始设置?即,我是否应该仅出于获取默认提供程序连接的纯粹目的而使用默认构造函数实例化一个虚拟EntityContext?有没有“更清洁”的方式?

顺便说一句,您认为在Form.Shown 事件的处理程序中执行这种类型的Form.Close() 调用是一种“安全”的做法吗?我在 MSDN 上读到,不建议在处理程序中调用 Form.Close() 来处理 Form.Load 事件。

public partial class MainWindow : Form {

    private void MainWindow_Shown(object sender, EventArgs e) {
        using (var logInWindow = new LogInWindow()) {
            if (logInWindow.ShowDialog(this) == DialogResult.OK) {
                this.serviceManager.InitializeContext(logInWindow.ConnectionString);
            } else {
                this.Close();
            }
        }
    }
}


public sealed class ServiceManager : IDisposable {

    public void InitializeContext(string connectionString) {
        if (this.EntityContext != null)
            throw new InvalidOperationException("EntityContext cannot be initialized multiple times.");

        var entityConnectionString = new EntityConnectionStringBuilder();
        entityConnectionString.ProviderConnectionString = connectionString;
        entityConnectionString.Provider = "System.Data.SqlClient";
        entityConnectionString.Metadata = "res://*/EntityModel.EntityModel.csdl|res://*/EntityModel.EntityModel.ssdl|res://*/EntityModel.EntityModel.msl";

        this.EntityContext = new EntityContext(entityConnectionString.ConnectionString);
        this.EntityContext.ObjectMaterialized += EntityContext_ObjectMaterialized;
    }
}

【问题讨论】:

    标签: c# .net sql-server entity-framework connection-string


    【解决方案1】:

    您可以使用 System.Configuration 类访问 App.config 的所有部分

    例子:

    var connectString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    
    var stringBuilder = new SqlConnectionStringBuilder(connectString);
    
    string UserID = stringBuilder.UserID;
    string Password = stringBuilder.Password;
    string catalog = stringBuilder.InitialCatalog;
    

    App.config

    <configuration>
       <connectionStrings>
         <add name="MyConnectionString" connectionString="metadata=res://*/...........
       </connectionStrings>
    </configuration>
    

    【讨论】:

    • 谢谢。现在我很好奇,ConfigurationManager.ConnectionStrings 集合返回什么类型的连接? EntityConnection?请记住,我只对它的 provider 连接字符串 部分感兴趣。
    • 哦,我明白了,这是一个ConnectionStringSettings...问题是,该类型不会将连接字符串分成几部分,即初始目录、Uset ID、密码等...我仍然觉得使用ConfigurationManager 很有用。
    • 我有一个应用程序可以完全按照您的要求进行操作,我只是拆分连接字符串以获取用户名/密码。可能有更好的方法来做到这一点,但我发现我这样做的方式没有问题:)
    • 有一种方法可以做你想做的事,也修复了我的实现:) 上面更新了
    • 我意识到这是一个旧答案,但认为其他人知道我发现它不适用于当前版本的 ADO.Net 会有所帮助。当我调用SqlConnectionStringBuilder() 构造函数时,它失败并出现异常消息“不支持关键字:'元数据'”。我的连接字符串是标准 EF 连接字符串 - ` `
    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2020-05-01
    • 2013-06-24
    相关资源
    最近更新 更多