c# - Entity Framework 在运行时更改连接

标签 c# entity-framework asp.net-web-api connection-string

我有一个 Web API 项目,它引用了我的模型和 DAL 程序集。用户会看到一个登录屏幕,他可以在其中选择不同的数据库。

我按如下方式构建连接字符串:

    public void Connect(Database database)
    {
        //Build an SQL connection string
        SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
        {
            DataSource = database.Server,
            InitialCatalog = database.Catalog,
            UserID = database.Username,
            Password = database.Password,
        };

        //Build an entity framework connection string
        EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
        {
            Provider = database.Provider,
            Metadata = Settings.Default.Metadata,
            ProviderConnectionString = sqlString.ToString()
        };
    }

首先,我如何实际更改数据上下文的连接?

其次,由于这是一个 Web API 项目,连接字符串(按照上面的登录设置)是在整个用户交互过程中保持不变还是应该每次都传递到我的数据上下文?

最佳答案

这个答案有点晚了,但我认为有一种潜在的方法可以用一种简洁的小扩展方法来做到这一点。我们可以利用 EF 约定优于配置加上一些小的框架调用。

无论如何,注释代码和示例用法:

扩展方法类:

public static class ConnectionTools
{
    // all params are optional
    public static void ChangeDatabase(
        this DbContext source,
        string initialCatalog = "",
        string dataSource = "",
        string userId = "",
        string password = "",
        bool integratedSecuity = true,
        string configConnectionStringName = "") 
        /* this would be used if the
        *  connectionString name varied from 
        *  the base EF class name */
    {
        try
        {
            // use the const name if it's not null, otherwise
            // using the convention of connection string = EF contextname
            // grab the type name and we're done
            var configNameEf = string.IsNullOrEmpty(configConnectionStringName)
                ? source.GetType().Name 
                : configConnectionStringName;

            // add a reference to System.Configuration
            var entityCnxStringBuilder = new EntityConnectionStringBuilder
                (System.Configuration.ConfigurationManager
                    .ConnectionStrings[configNameEf].ConnectionString);

            // init the sqlbuilder with the full EF connectionstring cargo
            var sqlCnxStringBuilder = new SqlConnectionStringBuilder
                (entityCnxStringBuilder.ProviderConnectionString);

            // only populate parameters with values if added
            if (!string.IsNullOrEmpty(initialCatalog))
                sqlCnxStringBuilder.InitialCatalog = initialCatalog;
            if (!string.IsNullOrEmpty(dataSource))
                sqlCnxStringBuilder.DataSource = dataSource;
            if (!string.IsNullOrEmpty(userId))
                sqlCnxStringBuilder.UserID = userId;
            if (!string.IsNullOrEmpty(password))
                sqlCnxStringBuilder.Password = password;

            // set the integrated security status
            sqlCnxStringBuilder.IntegratedSecurity = integratedSecuity;

            // now flip the properties that were changed
            source.Database.Connection.ConnectionString 
                = sqlCnxStringBuilder.ConnectionString;
        }
        catch (Exception ex)
        {
            // set log item if required
        }
    }
}

基本用法:

// assumes a connectionString name in .config of MyDbEntities
var selectedDb = new MyDbEntities();
// so only reference the changed properties
// using the object parameters by name
selectedDb.ChangeDatabase
    (
        initialCatalog: "name-of-another-initialcatalog",
        userId: "jackthelady",
        password: "nomoresecrets",
        dataSource: @".\sqlexpress" // could be ip address 120.273.435.167 etc
    );

我知道您已经具备了基本功能,但我认为这会增加一点多样性。

关于c# - Entity Framework 在运行时更改连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20216147/

相关文章:

c# - 表拆分 EF Core

c# - Visual Studio 类似 Eclipse 的格式设置

linq - 如何确定哪些 Linq 函数不会多次调用 sql?

c# - 在 C# UWP 应用程序中存储传感器数据的最佳和最快方式

entity-framework - 单元测试 EF - 如何从 BL 中提取 EF 代码?

c# - WebAPI 路由到具有多个可选参数的函数

c# - 在 asp.net core 中将字典发布到 web api

vb.net - HttpClient 返回 401 以及正确的授权 header

c# - WinForms 文本框中的换行符

c# - 如何退出 C# 机器人框架中的对话框?