实体框架代码第一个错误“找到指定的服务器/实例时出错”

时间:2012-06-18 21:25:48

标签: c# entity-framework-4.1 ef-code-first

我正在尝试将Code First与我的本地Sql Server 2008 R2实例一起使用。我创建了一个用户'dev',可以使用Sql Managment Studio登录并创建数据库。问题是我在EntityFramework中尝试使用DbContext创建数据库时不断收到错误消息。以下是错误消息:

  

“发生与网络相关或特定于实例的错误   建立与SQL Server的连接。找不到服务器或   无法访问。验证实例名称是否正确   SQL Server配置为允许远程连接。 SQL网络接口,错误:26 - 找到指定的服务器/实例时出错“

错误消息我检查了我的Sql Server,它确实允许远程连接。

我用以下代码抽象了我的系统并得到了同样的错误:

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);
        }
    }
}

6 个答案:

答案 0 :(得分:25)

我遇到了同样的错误,这让我疯狂了一天。我的情况是我有一个预先存在的启动项目的大型解决方案,我正在为持久性项目添加EF。

所以第一步是添加EF依赖项。这在我的持久性项目中创建了一个具有正确EF内容的app.config。然后我去了Enable-Migrations并在这篇文章中得到了同样的错误。此时我没想到将EF app.config设置复制到启动项目的app.config,因为我认为在最终运行应用程序之前我必须使用它。

当我将解决方案启动项目更改为持久性项目时,问题得以解决,因此我可以让EF找到正确的app.config。或者我可以将EntityFramwework相关部分复制到启动项目的app.config中。

答案 1 :(得分:1)

在本地发生了相同的错误消息,但昨天工作正常。 事实证明,解决方案中的错误项目被设置为StartUp Project。

因此,如果您在Package Manager控制台中的update-database命令之后也收到此消息,请务必检查是否设置了正确的StartUp Project。

例如Web项目,而不是其中一个帮助项目。 Visual Studio似乎有时习惯将其他项目设置为StartUp ...

答案 2 :(得分:0)

试着看看这里它解释了很多原因,因为你在评论中指出你明确指定了服务器名称,代码也在与sql server相同的机器上运行,因为从我看到的数据源只有一个点,表示它与运行的c#代码程序在同一台机器上。

http://blogs.msdn.com/b/sql_protocols/archive/2007/05/13/sql-network-interfaces-error-26-error-locating-server-instance-specified.aspx

答案 3 :(得分:0)

还必须将EntityFramework依赖项添加到启动项目中。

Install-Package EntityFramework

还必须将connectionStrings定义到我的主项目App.config / Web.config。

<connectionStrings>
    <add name="Database" providerName="System.Data.SqlClient" connectionString="foo.bar" />
</connectionStrings>

答案 4 :(得分:0)

这是我的解决方案 Traditional SqlClient can find server instance but EF can't

简而言之:

Database.SetInitializer<MyContext>(
new MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration>(
    useSuppliedContext: true));

这里的主要部分是 useSuppliedContext:true

答案 5 :(得分:0)

我遇到了同样的问题,花了一整天时间。终于找到了@Christian的回答,现在我找到了一个更好的方法!

ConnectionString放入启动项目中。因此,每次更改实体时都不需要切换。