简体   繁体   English

实体框架连接字符串不是来自配置

[英]Entity Framework connection string not from config

public class Context : DbContext
{
    public Context(string connString) : base(connString) 
    {
        Database.SetInitializer(new MyContextInitializer());
    }
//...

Need to pass a connection string to the context constructor. 需要将连接字符串传递给上下文构造函数。 How should the string look like, for example, for SQL Compact? 字符串应该如何,例如,对于SQL Compact? Tried this, but no success: 试过这个,但没有成功:

Context db = new Context("Provider=System.Data.SqlServerCe.4.0;Data Source=D:\\Context.sdf");

Edit: 编辑:

If I try this string: "Data Source=D:\\\\Context.sdf" 如果我尝试这个字符串: "Data Source=D:\\\\Context.sdf"

System.Data.ProviderIncompatibleException was unhandled System.Data.ProviderIncompatibleException未处理

Message=An error occurred while getting provider information from the database. Message =从数据库获取提供程序信息时发生错误。
This can be caused by Entity Framework using an incorrect connection string. 这可能是由实体框架使用不正确的连接字符串引起的。 Check the inner exceptions for details and ensure that the connection string is correct. 检查内部异常以获取详细信息,并确保连接字符串正确。

Source=EntityFramework 来源=的EntityFramework

And if I try to mention the provider like this: "Data Source=D:\\\\Context.sdf;provider=System.Data.SqlServerCe.4.0" 如果我尝试提到这样的提供程序: "Data Source=D:\\\\Context.sdf;provider=System.Data.SqlServerCe.4.0"

System.ArgumentException was unhandled System.ArgumentException未处理

Message=Keyword not supported: 'provider'. 消息=不支持关键字:'provider'。

Source=System.Data 来源= System.Data

I had a similar error with MVC 4 code first (while running update-database). 我首先遇到类似的MVC 4代码错误(运行update-database时)。 The error I was getting: 我得到的错误:

An error occurred while getting provider information from the database. 从数据库获取提供程序信息时发生错误。 This can be caused by Entity Framework using an incorrect connection string. 这可能是由实体框架使用不正确的连接字符串引起的。 Check the inner exceptions for details and ensure that the connection string is correct. 检查内部异常以获取详细信息,并确保连接字符串正确。

Turns out that I was missing some crucial information in my web.config to get it all working with localDB. 事实证明,我在web.config中遗漏了一些重要信息,以便全部使用localDB。 Here's the important sections (I used reference material from http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-configuration-file-settings.aspx ): 这是重要的部分(我使用了http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-configuration-file-settings.aspx中的参考资料):

<configuration>
  <configSections>
   <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ESTdb-01;Integrated Security=true" providerName="System.Data.SqlClient" />
  </connectionStrings>

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

And for good measure, here's my whole web.config (I'm using MVC 4, EF 4.3.1, EF-Migrations): 好的方法,这是我的整个web.config(我使用的是MVC 4,EF 4.3.1,EF-Migrations):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ESTdb-01;Integrated Security=true" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="true" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </sessionState>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

I suggest you to use always the EntityConnectionStringBuilder (System.Data.EntityClient): 我建议你总是使用EntityConnectionStringBuilder(System.Data.EntityClient):

EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
ecsb.Provider = "System.Data.SqlServerCe.4.0";
ecsb.Metadata = "..."; // your metadata
ecsb.ProviderConnectionString = "Data Source=D:\\Context.sdf";

then you can generate the connection string in a simple way: 然后你可以用一种简单的方式生成连接字符串:

Context db = new Context(ecsb.ToString());

UPDATE: 更新:

Try to create the EntityConnection, then pass it to the context, instead of connection: 尝试创建EntityConnection,然后将其传递给上下文,而不是连接:

EntityConnection conn = new EntityConnection(ecsb.ToString());
Context db = new Context(conn);

Anyway, where is the metadata? 无论如何,元数据在哪里? It's required by the EntityConnection! 这是EntityConnection的要求!

In my case (exactly the same error) it was solved by changing the default connection factory: 在我的情况下(完全相同的错误)它通​​过更改默认连接工厂解决:

Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

Leave out any reference to provider in your connection string because it isn't necessary (this way). 在连接字符串中省略对提供者的任何引用,因为没有必要(这种方式)。 I think I read that by default the Database.DefaultConnectionFactory is set to SqlConnectionFactory() but I can't find a reference for that. 我想我读过默认情况下,Database.DefaultConnectionFactory设置为SqlConnectionFactory(),但我找不到它的引用。

I had the same problem and it has been solved by: 我有同样的问题,它已通过以下方式解决:

1- setting the default project in the manager console to the project that contains the desired web.config 1-将管理器控制台中的默认项目设置为包含所需web.config的项目

2- setting the startup project for the solution to the same project in order for the update command to find the connection string. 2-将解决方案的启动项目设置为同一项目,以便update命令查找连接字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM