Передать строку подключения в код, первый DbContext - PullRequest
81 голосов
/ 26 января 2011

Как мне передать строку соединения в DbContext, кодирующий структуру сущностей? Моя генерация базы данных работает правильно, когда DbContext и строка подключения в web.config находятся в одном проекте и имеют одинаковые имена. Но теперь мне нужно переместить DbContext в другой проект, поэтому я тестирую передачу строки подключения к нему следующим образом:

Модель и контекст

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

Действие

    public ActionResult Index()
    {
        var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString);

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }

Web.Config

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>

Если я установлю точку останова в действии, чтобы проанализировать db, строка подключения будет там, но она не создаст и не найдет базу данных или что-либо еще.

Произошла ошибка сети или экземпляра при установлении соединения с SQL Server. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server)

Ответы [ 9 ]

78 голосов
/ 15 августа 2013

Немного опоздал на игру здесь, но другой вариант:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
55 голосов
/ 26 января 2011

После прочтения документации я должен вместо этого передать имя строки подключения:

var db = new NerdDinners("NerdDinnerDb");
35 голосов
/ 03 октября 2011

Думаю, я бы добавил этот бит для людей, которые ищут "Как передать строку подключения в DbContext": вы можете создать строку подключения для вашего основного хранилища данных и передать всю строку подключения конструктору вашего типаполучено из DbContext.

(повторное использование кода из @Lol Coder) Модель и контекст

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

Затем, скажем, вы строите строку соединения Sql, используя SqlConnectioStringBuilderнапример так:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

Где метод GetConnectionString создает соответствующую строку подключения, а SqlConnectionStringBuilder обеспечивает синтаксически правильную строку подключения;Затем вы можете создать экземпляр вашего db conetxt следующим образом:

var myContext = new NerdDinners(builder.ToString());
27 голосов
/ 09 ноября 2013

В вашем DbContext создайте конструктор по умолчанию для вашего DbContext и наследуйте базу следующим образом:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }
2 голосов
/ 24 апреля 2018

У меня есть небольшой пример решения этой проблемы.

MyDBContext.cs

 public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain")
  {
      if(ConnectionType==DBConnectionType.MainConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString;
       }
      else if(ConnectionType==DBConnectionType.BackupConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString;
       }
  }

MyClass.cs

public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }

frmMyForm.cs

 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
2 голосов
/ 30 сентября 2011

Если вы создаете строку подключения в приложении, вы должны использовать команду connString.Если вы используете строку подключения в веб-конфигурации.Затем вы используете «имя» этой строки.

1 голос
/ 26 января 2011

При использовании модели EF у меня есть строка подключения в каждом проекте, который использует модель EF.Например, у меня есть модель EF EDMX в отдельной библиотеке классов.У меня есть одна строка подключения в моем веб-проекте (mvc), чтобы он мог получить доступ к базе данных EF.

У меня также есть другой проект модульного тестирования для тестирования репозиториев.Чтобы репозитории могли получить доступ к базе данных EF, файл app.config тестового проекта имеет ту же строку подключения.

Соединения с БД должны быть настроены, а не закодированы, IMO.

1 голос
/ 26 января 2011

Проверьте синтаксис вашей строки подключения в web.config.Это должно быть что-то вроде ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

0 голосов
/ 26 января 2011

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

Вы создали папку App_Data в своем проекте, не так ли?

...