我正在尝试将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);
}
}
}
答案 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#代码程序在同一台机器上。
答案 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
放入启动项目中。因此,每次更改实体时都不需要切换。