Код ошибки Entity Framework First Error "Ошибка определения местоположения сервера/экземпляра"
Я пытаюсь использовать Code First с моим локальным экземпляром Sql Server 2008 R2. Я создаю пользовательский "dev" и могу входить в систему и создавать базы данных с помощью Sql Managment Studio. Проблема в том, что я продолжаю получать сообщение об ошибке при попытке создать базу данных с использованием DbContext в EntityFramework. Вот сообщение об ошибке:
"Возникла ошибка, связанная с сетью или конкретным экземпляром, в то время как установление соединения с SQL Server. Сервер не найден или был недоступен. Проверьте правильность имени экземпляра и SQL Server настроен для удаленного подключения. SQL Network Interfaces, ошибка: 26 - Ошибка определения местоположения сервера/экземпляра"
Сообщение об ошибке я проверил свой Sql-сервер и разрешил удаленные подключения.
Я отвлек мою систему следующим кодом и получаю ту же ошибку:
namespace CodeFirstConsole
{
public class Program
{
static void Main(string[] args)
{
var db = new MyContext();
try { Console.WriteLine(db.Parents.Count()); }
catch (Exception) { throw; }
Console.Read();
}
}
internal class MyContext : DbContext
{
public DbSet<ParentObject> Parents { get; set; }
public DbSet<ChildObject> Children { get; set; }
public MyContext()
{
this.Database.Connection.ConnectionString =
"Data Source=.;Database=ConsoleTest;Initial Catalog=ConsoleTest;User ID=dev;Password=dev;";
}
}
internal class ParentObject
{
public int Id { get; set; }
public string PropertyOne { get; set; }
}
internal class ChildObject
{
public int Id { get; set; }
public bool PropertyOne { get; set; }
public string PropertyTwo { get; set; }
public virtual ParentObject Parent { get; set; }
}
internal class MyInitializer : DropCreateDatabaseAlways<MyContext>
{
protected override void Seed(MyContext context)
{
context.Parents.Add(new ParentObject() { PropertyOne = "hi" });
base.Seed(context);
}
}
}
Ответы
Ответ 1
У меня была такая же ошибка, которая заставляла меня орехами около дня. Моя ситуация заключалась в том, что у меня было большое решение с ранее созданным проектом запуска, и я добавлял EF в проект сохранения.
Итак, первым шагом было добавление зависимости EF. Это создало app.config в моем проекте сохранения с правильным содержимым EF. Затем я пошел в Enable-Migrations и получил ту же ошибку в этом сообщении. На данный момент я не думал о копировании параметров EF app.config в app.config проекта запуска, так как я думал, что мне придется поиграть с ним, прежде чем я в конечном итоге запустим приложение.
Проблема была решена, когда я сменил проект запуска решения на проект персистентности, чтобы я мог получить EF, чтобы найти правильный app.config. Или я мог бы скопировать раздел, связанный с EntityFramwework, в app.config проекта запуска.
Ответ 2
Если бы такое же сообщение об ошибке появлялось на локальном, но вчера оно работало нормально.
Оказывается, что неправильный проект в решении был установлен как проект StartUp.
Итак, если вы также получаете это сообщение после команды update-database в консоли диспетчера пакетов, убедитесь, что установлен правильный проект StartUp.
Например, веб-проект, а не один из вспомогательных проектов.
У Visual Studio, похоже, есть привычка иногда устанавливать другие проекты как StartUp...
Ответ 3
Попробуйте посмотреть здесь, он объясняет многие причины, так как вы указали в комментариях, что вы явно указали имя сервера, а код запускается также на том же компьютере, что и sql-сервер, поскольку из того, что я вижу, источник данных просто имеет точка, указывающая, что она работает на той же машине, что и программа кода С#.
http://blogs.msdn.com/b/sql_protocols/archive/2007/05/13/sql-network-interfaces-error-26-error-locating-server-instance-specified.aspx
Ответ 4
Придется добавить зависимость EntityFramework также к проекту запуска.
Install-Package EntityFramework
И также пришлось определить connectionStrings
в моем основном проекте App.config/Web.config.
<connectionStrings>
<add name="Database" providerName="System.Data.SqlClient" connectionString="foo.bar" />
</connectionStrings>
Ответ 5
Вот решение для меня
Традиционный SqlClient может найти экземпляр сервера, но EF не может
Короче:
Database.SetInitializer<MyContext>(
new MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration>(
useSuppliedContext: true));
Основная часть здесь useSuppliedContext: true
Ответ 6
У меня была такая же проблема, и я провел целый день. Наконец нашел ответ @Christian, и теперь я нахожу намного лучший способ!
Поместите ConnectionString
в проект запуска. Поэтому вам не нужно переключаться каждый раз, когда вы меняете сущность.