【问题标题】:Entity framework 4.1 won't connect to SQL Server after using Database First approach使用 Database First 方法后,Entity Framework 4.1 将无法连接到 SQL Server
【发布时间】:2011-10-25 07:07:30
【问题描述】:

我使用 EF 4.1 和 DB first 方法创建了一个新的 MVC 3 网站。我创建了 edmx 文件,然后创建了 DBContext(新的 4.1 功能)类。一切顺利。

然后,我使用 DBContext 的自动创建创建了新的控制器。一切都不是很好。

现在,我正在尝试启动网站,它不会连接到自己创建的连接字符串。

这是连接字符串:

<add name="PizzaByMeEntities"
     connectionString='metadata=res://*/Models.PizzaByMeModel.csdl|
                                res://*/Models.PizzaByMeModel.ssdl|
                                res://*/Models.PizzaByMeModel.msl;
                       provider=System.Data.SqlClient;
                       provider connection string="data source=(local);
                                                   initial catalog=PizzaByMe;
                                                   integrated security=True;
                                                   pooling=False;
                                                   multipleactiveresultsets=True;
                                                   App=EntityFramework;"'
     providerName="System.Data.EntityClient" />

当我启动网站时,我得到:

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

奇怪的是,如果我删除连接字符串 - 我仍然会得到完全相同的错误。我猜 EF 就是找不到连接字符串,即使它在那里。

有什么想法吗?

谢谢!

编辑:

我的DBContext如下:

public partial class PizzaByMeEntities : DbContext
{
    public PizzaByMeEntities()
        : base("name=PizzaByMeEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public DbSet<X> Xs{ get; set; }
    public DbSet<Y> Ys{ get; set; }
    public DbSet<Z> Zs{ get; set; }
}

编辑 2:

有效的连接字符串是这样的:

  <add name="PizzaByMe" connectionString="Data Source=(local);initial catalog=PizzaByMe;integrated security=True;pooling=False;multipleactiveresultsets=True;" providerName="System.Data.EntityClient" />

虽然让它工作 - 我只是使用直接 ADO.NET 连接。

【问题讨论】:

  • 我建议的第一件事是验证此连接字符串是否正常(提供程序连接字符串,而不是整个实体)。也许将它转储到一个简单的 SqlConnection/SqlCommand/SqlDataReader 周围的测试页面或应用程序中,看看它是否连接。如果没有,那么你的问题就在那里。如果没问题,那么至少您知道问题出在 EF 或您的代码上,而不是您的数据库连接字符串。
  • 我已经检查过了 - 工作正常。
  • 您运行的是什么版本的 SQL Server?
  • @itsmatt - 我正在使用 SQL Server 2008 Express
  • 好的,嗯。当我使用 Express SKU 时,我的数据源是一个命名的东西,例如“data source=.\SQLEXPRESS;” - 使用完整的 SQL Server,我的数据源现在类似于“data source=localhost” - 不知道这是否有帮助,但我的连接字符串肯定不同。也许它可以与命名实例一起使用。只是一个想法。

标签: asp.net-mvc-3 entity-framework-4.1


【解决方案1】:

如果您只实现了默认构造函数(或根本没有构造函数),则派生的 DbContext 类必须与连接字符串同名

public PizzaByMeEntities : DbContext
{
    public PizzaByMeEntities()
    {
        // ...
    }
}

如果您的上下文有另一个名称,那么您必须在构造函数中指定连接字符串的名称:

public PizzaByMeContext : DbContext
{
    public PizzaByMeContext() :
        base("name=PizzaByMeEntities")
    {
        // ...
    }
}

以下是有关DbContext 的连接和连接字符串的详细信息:http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-2-connections-and-models.aspx

编辑:另一个猜测

连接字符串必须在您的 MVC 应用程序的 web.config 中,而不是在您可能拥有 EF 模型和 DbContext 的类库项目的 app.config 中。是吗?

【讨论】:

  • @roman:在您的解决方案中,您的 EF 模型和上下文是否位于单独的项目(类库?)中?如果是,您是否将连接字符串复制到 MVC 应用程序的 web.config 中?
  • 没有。他们都在同一个项目中,所以他们共享连接字符串。
  • 关于你的问题。它肯定在 web.config 中——就在 EF 自己放置的地方。这是奇怪的事情。
【解决方案2】:

Phewwww....想通了!!!

控制器创建的上下文对象(当您使用新上下文时)它创建的对象没有选择连接字符串的构造函数。所以它尝试使用一些不存在的连接字符串。

总结 - 任何从 DBContext 派生的对象都应该使用指定连接字符串的构造函数。

感谢大家帮助我:))

【讨论】:

  • 嗯?那么,您的上下文中是否有第二个构造函数接受一个或多个参数?是 DbContext 生成器创建的还是您手动编写的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多