2015-11-09 3 views
0

У меня есть ConnectionString следующим образом:Как установить имя ConnectString динамически в asp.net MVC 5

<add name="EDentalCADBContext" connectionString="data source=*.*.*.*\SQLEXPRESS;Initial Catalog=*******;User id=*****;Password=******;" providerName="System.Data.SqlClient" /> 

Я создал тот же ConnectionString динамически, но я не могу установить имя ConnectionString такого как name = "EDentalCADBContext" выше.

Как я могу задать имя динамически?

Thanks

+1

Вы не предназначены. Ваш файл web.config предназначен для чтения и не изменяется программой, которая загружает его. Вы все еще можете, но я хочу знать, почему вы хотите, прежде чем продолжить. – Dai

+0

Я не хочу использовать ConnectionString из web.config. Я создал его динамически. Поэтому мне нужно установить имя, чтобы оно соответствовало DBContext. – Sam

+0

Я скопировал свой код. context.Users. ToList() выдает ошибку. Он ищет имя EDentalCADBContext в connectionString. Должна ли она быть такой же? – Sam

ответ

0

Я согласен с @Dai выше. Если вы динамически создаете код в коде, то в чем смысл вставить оболочку конфигурации. Почему бы просто не использовать его напрямую? Точка всего этого интерфейса действительно должна читать информацию из общих файлов .config.

Тем не менее, это есть возможно. При создании экземпляра ConnectStringSettings, вы передаете «имя» и «ConnectionString» в конструкторе: https://msdn.microsoft.com/en-us/library/wd8h82yf(v=vs.110).aspx

+0

Не могли бы вы сказать мне, что я делаю правильно? string providerString = sqlBuilder.ConnectionString; ConnectionStringSettings css = new ConnectionStringSettings ("EDentalCADBContext", providerString); conn = new SqlConnection (css.ToString()); – Sam

+0

Я бы не ожидал, что ToString() обязательно вернет значение строки подключения. Если да, то все еще не очень понятно. Вместо этого используйте свойство css.ConnectionString. Но все же это кажется слишком сложным. Почему бы просто не передать sqlBuilder.Connection строку в соединение? Пример: conn = new SqlConnection (sqlBuilder.ConnectionString); –

+0

... и в качестве альтернативы, как указывали предыдущие сообщения, если в конечном итоге в коде вы попадаете в объект DbContext, это будет работать: DbContext myContext = new DbContext (sqlBuilder.ConnectionString); - Ссылочный статус MS вы можете передать имя строки соединения или соответствующую строку литерала. Оба работают. –

0

В свой комментарий, вы написали

I dont want to use ConnectionString from web.config. I created it dynamically. So I need to set the name to match it with DBContext

Решение не соответствует «волшебной строки», что что DbContext ожидает (я полагаю, это было указано, когда вы использовали мастер EF в Visual Studio), но вместо того, чтобы использовать DbContext конструктор, который принимает необработанную строку соединения:

String connectionString = "server=dbserver.local;Integrated Security=SSPI;..."; 
using(DbContext db = new DbContext(connectionString)) { 
    // do stuff 
} 
+0

Я не тестировал это, но документы MSDN являются своеобразными. Перегрузка конструктора, которая принимает только строку, не упоминает «имя строки подключения или фактическую строку», но это делает: DbContext Constructor (String, DbCompiledModel) https://msdn.microsoft.com/en-us/library/system.data .entity.dbcontext.dbcontext (v = vs.113) .aspx # М: System.Data.Entity.DbContext. Поддерживают ли они это, а документы - неправильные? –

+0

Nevermind, я прочитал это неправильно. Обе перегрузки указывают его явно: * Создает новый экземпляр контекста, используя данную строку, в качестве строки имени -OR- для базы данных, к которой будет создано соединение. * Каждый раз, когда я читаю ее, мой мозг меня обманывает, читая «имя - OF-connection string " –

+0

Я пробовал это, но он дает мне ту же ошибку SQL. Если я раскомментирую ConnectionString в Web.Config, тогда это ОК. Если я изменил имя ConnectionString, вы получите ту же ошибку. Ошибка: При установлении соединения с SQL Server возникла связанная с сетью или конкретная ошибка экземпляра. Сервер не найден или не был доступен. Проверьте правильность имени экземпляра и настройте SQL Server для удаленного подключения. (поставщик: сетевые интерфейсы SQL, ошибка: 26 - ошибка определения местоположения сервера/экземпляра) – Sam

0
EDentalCADBContext context = new EDentalCADBContext(); 

    public ActionResult Masters(int? pageNumber, string tableName) 
       { 
        EstablishConnection(); // This creates the connection with DB dynamically. 


        int? page = 1; 
        ViewData["MenuItems"] = MenuItem.ActivateMenu("Masters"); 
        ViewData["Users"] = context.Users.ToList(); 
     } 

    public class EDentalCADBContext : DbContext 
     { 
      // public EDentalCADBContext() : base("EDentalCADBContext") { } 
      public DbSet<NotificationItem> NotificationItems { get; set; } 
      public DbSet<User> Users { get; set; } 

Ожидается, что имя соединительной строки EDentalCADBContext. Почему это должно совпадать?

0

Я пронзаю в темноте, не зная конкретно, как работает остальная часть вашего кода. Но вы попросили меня попробовать, так что вот мое лучшее ...

Если у вас есть собственный пользовательский класс, наследующий от DbContext, тогда вы должны реализовать свой собственный конструктор, чтобы взять строку подключения. Вы не можете наследовать нестандартные конструкторы. Таким образом, я изменил свой класс ниже, чтобы иметь конструктор, чтобы взять в строке:

public class EDentalCADBContext : DbContext { 
    public DbSet<NotificationItem> NotificationItems { get; set; } 
    public DbSet<User> Users { get; set; } 

    public EDentalCADBContext(string connectionNameOrString) : 
     base(connectionStringOrName) { 
    } 
} 

Вы бы экземпляр так:

EDentalCADBContext context = new EDentalCADBContext("literal conn string"); 
// Perhaps comes from sqlBuilder.ConnectionString per your comments? 
+0

Это сработало, но еще одна ошибка: [InvalidOperationException: для этой операции требуется подключение к базе данных «master». Не удалось создать соединение с базой данных «master», поскольку исходное соединение с базой данных было открыто и учетные данные были удалены из строки подключения. Поставьте нераспечатанное соединение.] – Sam

+0

Смотрите: http://stackoverflow.com/questions/19977141/this-operation-requires-a-connection-to-the-master-database –

+0

уже сделал это. бросает ту же ошибку, что и раньше: ... Но нет ничего плохого в connectString coz, если я использую его в web.config, он отлично работает. При установлении соединения с SQL Server возникла связанная с сетью или конкретная ошибка экземпляра. Сервер не найден или не был доступен. Проверьте правильность имени экземпляра и настройте SQL Server для удаленного подключения. (поставщик: сетевые интерфейсы SQL, ошибка: 26 - ошибка определения местоположения сервера/экземпляра) – Sam

0
public EDentalCADBContext(string con = null) 
    : base(string.IsNullOrEmpty(con) ? "name=EDentalCADBContext" : con) 
{ 



} 

В вашем контексте EDentalCADBContext класса.
Затем, когда вы экземпляр этого EDentalCADBContext, вы передаете строку Connection в качестве параметра. Пример. EDentalCADBContext db = новый EDentalCADBContext (строка подключения);

Смежные вопросы