0

Я строю мой WebAPI проект на основе этой статьи: A simple POC using ASP.NET Web API, Entity Framework, Autofac, Cross Domain SupportC# Настройка Entity Framework ConnectionString в контроллере

Однако, мне нужно передать строку подключения к DbContext, поскольку пользователь, который подключается к WebAPI может выбрать различные базы данных для работы.

Где и что это лучший способ реализовать это? В контроллере, имеющем отдельный «сервис» или синглтон?

ответ

0

Я в настоящее время здание веб-сайт, который также требует нескольких баз данных. Это основы (на данный момент). Это может быть не лучший/эффективный способ, но он выполняет эту работу, чтобы я мог продолжить работу на сайте.

Предположим, у вас есть это соединение, и все, что есть правильно, за исключением того, что имя базы данных может измениться.

<add name="MyDbContext" connectionString="Server=SomeConnection;Database=SomeDatabase;"providerName="System.Data.SqlClient" /> 

Вы можете создать строку подключения на лету с этим

public MyDbContext CreateDbContext(string databaseName) 
{ 
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(System.Configuration.ConfigurationManager.ConnectionStrings["MyDbContext"].ConnectionString); // Gets the default connection 
    sqlBuilder.InitialCatalog = databaseName; // Update the database name 

    return new MyDbContext(sqlBuilder.ToString()); 
} 

Кроме того, если вы не хотите, чтобы автоматически создать базу данных, если она не существует, возможно, от неправильного имени базы данных, вам нужно для установки инициализатора. Просто передайте значение инициализатора null, чтобы предотвратить автоматическое создание ef. Я установил это в конструкторе MyDbContext

public class MyDbContext : DbContext 
{ 
    /* some other constructors */ 

    public MyDbContext(string nameOrConnectionString, bool createDb) 
     : base(nameOrConnectionString) 
    { 
     if(!createdDb) 
     { 
      System.Data.Entity.Database.SetInitializer<MyDbContext>(null); 
     } 
    } 
} 
0

Одним из способов было бы иметь несколько ConnectionStrings в вашей веб-конфигурации. Затем можно выбрать ConnectionString использовать в зависимости от параметра, переданного вашей WebAPI:

В вашем веб-конфигурации:

<connectionStrings> 
<add name="dataBase1" connectionString="/*db info here*/" providerName="System.Data.SqlClient" /> 

<add name="dataBase2" connectionString="/*db info here*/" providerName="System.Data.SqlClient" /> 
</connectionStrings>  

Затем в коде:

public someobject GetData(/*arguments*/, string dbType) 
{ 
    var connectionString = dbType == 'dataBase1' 
    ? ConfigurationManager.ConnectionString['dataBase1'].toString() 
    : ConfigurationManager.ConnectionString['dataBase2'].toString() 

    /*then pass connectionString to dbContext*/ 
    var dbContext = new DbContext(connectionString); 
} 
+0

У меня есть соединительные линии в отдельном дБ. Я думал использовать cookie с просьбой. Тем не менее, я до сих пор не знаю, как установить connectionstring в классе DatabaseFactory. –