Member 12586110 Ответов: 0

C# динамическое изменение Entity framework connectionstring


Привет, используя приведенный ниже метод web api GET с entity framework. В настоящее время класс SchoolDBEntities() подключается к базе данных DEV. Как я могу изменить connectionstring, когда API перемещается до QAT, Pre-PROD & PROD. Есть ли способ, чтобы изменить его из интернета.файл config?

public class StudentController : ApiController
{
    public IHttpActionResult GetAllStudents ()
    {
        IList<StudentViewModel> students = null;

        using (var ctx = new SchoolDBEntities())
        {
            students = ctx.Students.Include("StudentAddress")
                        .Select(s => new StudentViewModel()
                        {
                            Id = s.StudentID,
                            FirstName = s.FirstName,
                            LastName = s.LastName
                        }).ToList<StudentViewModel>();
        }

        if (students.Count == 0)
        {
            return NotFound();
        }

        return Ok(students);
    }
}


Что я уже пробовал:

Я попытался использовать приведенный ниже код. Но не смог заставить его работать.

string connectionString = new System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);

System.Data.SqlClient.SqlConnectionStringBuilder scsb = new System.Data.SqlClient.SqlConnectionStringBuilder(connectionString);

EntityConnectionStringBuilder ecb = new EntityConnectionStringBuilder();
ecb.Metadata = "res://*/Sample.csdl|res://*/Sample.ssdl|res://*/Sample.msl";
ecb.Provider = "System.Data.SqlClient";
ecb.ProviderConnectionString = scsb.ConnectionString;

dataContext = new SampleEntities(ecb.ConnectionString);


public class SingleConnection
    {
        private SingleConnection() { }
        private static SingleConnection _ConsString = null;
        private String _String = null;

        public static string ConString
        {
            get
            {
                if (_ConsString == null)
                {
                    _ConsString = new SingleConnection { _String = SingleConnection.Connect() };
                    return _ConsString._String;
                }
                else
                    return _ConsString._String;
            }
        }

        public static string Connect()
        {
            //Build an SQL connection string
            SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
            {
                DataSource = "SQLSERVER\\DEV".ToString(), // Server name
                InitialCatalog = "TestDB",  			  //Database
                UserID = "devuser",         			  //Username
                Password = "devpassword",  				  //Password
            };
            //Build an Entity Framework connection string
            EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                Metadata = "res://*/DevModel.csdl|res://*/DevModel.ssdl|res://*/DevModel.msl",
                ProviderConnectionString = @"data source=SQLSERVER\DEV;initial catalog=TestDB;user id=devuser;password=devpassword"   // sqlString.ToString()
            };
            return entityString.ConnectionString;
        }
	}

F-ES Sitecore

Обычно это делается с помощью так называемого "преобразования конфигурации", но это также зависит от того, какие инструменты развертывания вы используете (если таковые имеются) для передачи кода в другие среды.

Member 12586110

Привет, не могли бы вы помочь мне сделать это с помощью кода. Я обновил свой первоначальный пост соответствующим образом. Спасибо.

F-ES Sitecore

Если вы хотите сделать это в коде, то самый простой способ-иметь строку подключения для каждой среды в вашей конфигурации, например "ConnectionStringDev", "ConnectionStringTest" и т. д. Затем у вас есть другое значение конфигурации (например, ConnectionStringName), которое говорит, какова текущая строка подключения, поэтому на вашем локальном компьютере вы бы установили ее в "ConnectionStringDev". Вместо жесткого кодирования строки подключения для извлечения, вы будете использовать значение config вместо этого

строка connectionString = новая система.Конфигурация.Конфигурационные настройки.AppSettings[System.Конфигурация.Конфигурационные настройки.Параметр Appsettings["Заголовком"]]);

j snooze

Просто к вашему сведению, если у вас есть строки подключения в вашем конфигурационном файле и есть система.Конфигурация, добавленная в ваш проект, все, что вам нужно сделать, чтобы получить строку подключения из раздела строка подключения, - это следующее.
Конфигурационный менеджер.ConnectionStrings["DefaultConnection"].Параметр connectionString

Я предполагаю, что в вашем конфигурационном файле у вас есть
элемент connectionStrings вместе с --add name="DefaultConnection" connectionString="my server connection information here"--

Member 12586110

Привет, файл web.config имеет строку подключения базы данных.

<соединительные нити>
&ЛТ;добавить имя="mysqldb" connectionString="metadata=res://*/DevModel.csdl|res://*/DevModel.ssdl|res://*/DevModel.msl;provider=System.Data.SqlClient;поставщика строка подключения="источник данных=от SQLServer\Дев;начальный каталог=база данных testdb;идентификатор пользователя=devuser;пароль=devpassword;значение multipleactiveresultsets=true;в приложение=и EntityFramework"" имя_поставщика="системы.Данных.Entityclient создан" /&ГТ;


Как я могу использовать это в своем коде?

строка connectionString = System.Конфигурация.Конфигурационный менеджер.ConnectionStrings["mysqldb"].Параметр connectionString;

j snooze

Ну, если бы я правильно прочитал ваш код, я бы заменил жестко закодированные Stringbuilders в вашем методе Connect и просто вернул строку подключения, которую вы получаете обратно из configuration manager. Я предполагаю, что это те строки подключения, которые вы сейчас используете для подключения к своей базе данных?

Member 12586110

Привет, поскольку у меня есть строка подключения "SchoolDBEntities", могу ли я просто изменить сервер базы данных & database из файла web.config на DbContext во время развертывания?

public partial class SchoolDBEntities : DbContext
{
общественные SchoolDBEntities()
: base("name=SchoolDBEntities")
{
}
}

<соединительные нити>
&ЛТ;добавить имя="SchoolDBEntities" connectionString="metadata=res://*/DevModel.csdl|res://*/DevModel.ssdl|res://*/DevModel.msl;provider=System.Data.SqlClient;поставщика строка подключения="источник данных=от SQLServer\Дев;начальный каталог=база данных testdb;идентификатор пользователя=devuser;пароль=devpassword;значение multipleactiveresultsets=true;в приложение=и EntityFramework"" имя_поставщика="системы.Данных.Entityclient создан" /&ГТ;

0 Ответов