Недавно начал пытаться разобраться с первым подходом к коду для Entity Framework. Я создал несколько таблиц базы данных, следуя различным руководствам, но ни один из них не помог.
Начиная с нуля примерно 3-4 раза, потому что исключения становятся все более и более абсурдными. В прошлый раз база данных была создана при первом доступе, но не удалось подключиться к базе данных во втором сеансе отладки из-за отсутствия разрешений (используя встроенную систему безопасности — что?). По-видимому, .mdf был заблокирован системным процессом, и только перезагрузка в безопасном режиме позволила мне избавиться от него.
Во всяком случае, заново. У меня есть библиотека классов, которая содержит модели баз данных и класс шлюза для внешнего доступа. У меня есть консольный проект для проверки создания базы данных и доступа к ней. EF устанавливается в библиотеку классов через NuGet, в консольный проект добавляется ссылка на EntityFramework.SqlServer.dll.
Строка подключения в обоих проектах выглядит так:
<connectionStrings>
<add name="DbConnection"
connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\LanguageCreator.mdf;Initial Catalog=LanguageCreator;Integrated Security=SSPI"
providerName="System.Data.SqlClient" />
</connectionStrings>
Мой контекстный класс выглядит так:
public class LanguageContext : DbContext {
public LanguageContext() : base("DbConnection") {
// Have to set the DataDirectory in code because the wrong one gets set from the config.
AppDomain.CurrentDomain.SetData("DataDirectory", Directory.GetCurrentDirectory());
Database.SetInitializer(new CreateDatabaseIfNotExists<LanguageContext>());
public DbSet<Language> Languages { get; set; }
public DbSet< ... blablabla various other DbSets following, nothing of interest here.
}
Вот так выглядит мой шлюз:
public class Gateway {
public void InitializeDatabase() {
using (LanguageContext context = new LanguageContext()) {
context.Database.Initialize(true);
// I did have a configuration class for migration, which seeds some initial data, which is why I'm trying to read the WordTypes here but I left that thing out this time ... will try to add it later on.
IEnumerable<WordType> wordTypes = context.WordTypes.AsEnumerable();
List<Language> languages = context.Languages.ToList();
}
}
}
Просто вызов выглядит так:
class Program {
static void Main(string[] args) {
Gateway databaseGateway = new Gateway();
databaseGateway.InitializeDatabase();
}
}
Теперь, абсолютно ничего особенного, я получаю следующую ошибку при запуске сеанса отладки:
При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (поставщик: SQL Network Interfaces, ошибка: 50 — Произошла ошибка выполнения локальной базы данных. Невозможно создать автоматический экземпляр. Подробные сведения об ошибке см. в журнале событий приложений Windows.
К сожалению, журнал событий приложений Windows не показывает никаких сведений об этой ошибке. А может я слишком тупой, чтобы найти...
Что на самом деле вызывает эту проблему и как я могу это исправить? Все, что я нашел, касалось доступа к внешним SQL-серверам, но я просто хочу, чтобы EF локально создавал .mdf и подключался к нему.