Ответ 1
После прочтения документов я должен передать имя строки подключения вместо:
var db = new NerdDinners("NerdDinnerDb");
Как передать строку соединения в сущность framework-first 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 для удаленного подключения. (поставщик: поставщик Named Pipes, ошибка: 40 - не удалось открыть подключение к SQL Server)
После прочтения документов я должен передать имя строки подключения вместо:
var db = new NerdDinners("NerdDinnerDb");
Немного поздно в игре здесь, но другой вариант:
public class NerdDinners : DbContext
{
public NerdDinners(string connString)
{
this.Database.Connection.ConnectionString = connString;
}
public DbSet<Dinner> Dinners { get; set; }
}
Думаю, я добавлю этот бит для людей, которые ищут "Как передать строку соединения в 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 Connection, используя SqlConnectioStringBuilder, например:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());
Если метод GetConnectionString создает соответствующую строку соединения, а SqlConnectionStringBuilder гарантирует, что строка соединения синтаксически корректна; вы можете затем создать экземпляр db conetxt следующим образом:
var myContext = new NerdDinners(builder.ToString());
В вашем DbContext создайте конструктор по умолчанию для вашего DbContext и наследуйте базу следующим образом:
public myDbContext()
: base("MyConnectionString") // connectionstring name define in your web.config
{
}
Если вы создаете строку подключения в приложении, вы должны использовать команду connString. Если вы используете строку подключения в веб-конфигурации. Затем вы используете "имя" этой строки.
Проверьте синтаксис строки подключения в файле web.config. Это должно быть что-то вроде ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"
При использовании EF-модели у меня есть строка подключения в каждом проекте, которая использует модель EF. Например, у меня есть модель EF EDMX в отдельной библиотеке классов. У меня есть одна строка подключения в моем проекте web (mvc), чтобы он мог получить доступ к EF db.
У меня также есть еще один проект unit test для тестирования репозиториев. Для того, чтобы хранилища могли получить доступ к db EF, файл app.config тестового проекта имеет ту же строку соединения.
Соединения БД должны быть сконфигурированы, а не закодированы, ИМО.
Не вижу ничего плохого в вашем коде, я использую SqlExpress, и он отлично работает, когда я использую строку соединения в конструкторе.
Вы создали папку App_Data в своем проекте, не так ли?
У меня есть небольшой пример решения этой проблемы.
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);