【问题标题】:Setting provider and connection string in EntityFramework for MySql在 EntityFramework for MySql 中设置提供程序和连接字符串
【发布时间】:2014-09-01 08:42:22
【问题描述】:

我正在使用实体框架,在我的解决方案中有 9 个项目,它会扩大。我的问题是在 .config 文件中说明连接字符串。当我这样做时,我必须为 4-5 个项目声明连接字符串,当我想更改我的连接时,更改 ConnectionStrings 成为 4 或 5 个项目的义务。我想在 DbContext 构造函数中设置连接字符串。 DbContext 可以为我提供这种能力,但我无法定义 providerName。所以上下文的 dbconnection 自动使用 SqlClient 但我想使用 MySql 提供程序。我的连接字符串是:

"Server=localhost;Database=xxx;Uid=auth_windows;Persist Security Info=True;User=root;Password=yyyyyy;"

我也不能在“Provider = MySql.Data.MySqlClient”之类的连接字符串中指定提供程序名称。它抛出异常“不支持提供者关键字”。

我正在更改我的问题以便更易于理解。

总之我想要这个。

public class XxContext : DbContext
{

       public XxContext()
       {

            this.Database.Connection.Provider = "MySql.Data.MySqlClient";
            this.Database.Connection.ConnectionString = "Server=localhost bla bla bla";

       }
}

但我不知道如何说明您应该使用 MySql.Data.MySqlClient(没有配置文件)。可能吗 ?如果是,我该怎么办?

【问题讨论】:

  • 所以你想在代码或配置中更改 Provider?
  • 我想修改代码

标签: c# mysql entity-framework


【解决方案1】:

你的是connection string used with SqlConnection objects。由于这些对象仅支持 SQL Server,因此您不能使用 Provider 关键字。此外,由于您使用的是 EF,因此您需要指定不同的连接字符串才能使用数据库模型、上下文和 Provider 关键字。典型的EF connection string 是:

<connectionStrings>
    <add name="AdventureWorksEntities" 
         connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;
         provider=System.Data.SqlClient;provider connection string='Data Source=localhost;
         Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60;
         multipleactiveresultsets=true'" providerName="System.Data.EntityClient" />
</connectionStrings>

要使用 MySQL 提供程序,请考虑this answer 中提供的这些步骤:

Entity Framework 6 提供了一些方便的细微变化,有助于 让 MySQL 工作并创建动态数据库连接。 让 MySQL 与 Entity Framework 6 一起工作

首先,在我回答这个问题之日,唯一的 .Net 与 EF6 兼容的连接器驱动程序是 MySQL .Net 连接器 6.8.1(Beta 开发版),可在此处的 MySQL 官方网站上找到。

安装后,从您的 Visual 中引用以下文件 工作室解决方案:

Mysql.Data.dll
Mysql.Data.Entity.EF6.dll

您还需要将这些文件复制到它们所在的位置 在构建期间可访问项目,例如 bin 目录。

接下来,您需要将一些项目添加到您的 Web.config(或 App.config,如果 基于桌面)文件。

一个连接字符串:

<connectionStrings>
    <add name="mysqlCon"
         connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password"

         providerName="MySql.Data.MySqlClient" /> </connectionStrings>

还可以在 and 节点内添加提供程序,可选(这是第二部分的绝对必要条件) 我的回答,在处理动态定义的数据库时)你可以 更改节点:

<entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
    <providers>
        <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
    </providers> </entityFramework>

如果您从默认的 sql server 更改 defaultConnectionFactory 连接,不要忘记删除节点 嵌套在 defaultConnectionFactory 节点中。这 MysqlConnectionFactory 不接受任何参数 构造函数,如果参数仍然存在,将失败。

【讨论】:

    【解决方案2】:

    您可以使用在配置文件中注册的DbProviderFacory(参见MSDNSO article)。

    你的配置文件应该是这样的

    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider"
           invariant="MySql.Data.MySqlClient"
           description=".Net Framework Data Provider for MySQL"
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
    

    你的DbContextIDbContextFactory 实现是这样的......

    DbContext

    public class MyDbContext
        : DbContext
    {
        public MyDbContext(DbConnection connection, bool contextOwnsConnection)
            : base(connection, contextOwnsConnection)
        {
    
        }
    }
    

    IDbContextFactory

    public class MyDbContextFactory
        : IDbContextFactory<MyDbContext>
    {
        private readonly string _connectionStringName;
    
        public MyDbContextFactory(string connectionStringName)
        {
            Contract.Requires<NullReferenceException>(
                !string.IsNullOrEmpty(connectionStringName),
                "connectionStringName");
            _connectionStringName = connectionStringName;
        }
    
        public MyDbContext Create()
        {
            var connectionStringSettings = ConfigurationManager
                .ConnectionStrings[_connectionStringName];
    
            var connection = DbProviderFactories
                .GetFactory(connectionStringSettings.ProviderName)
                .CreateConnection();
    
            if (connection == null)
            {
                var message = string.Format(
                    "Provider '{0}' could not be used",
                    connectionStringSettings.ProviderName);
                throw new NullReferenceException(message);
            }
    
            connection.ConnectionString = connectionStringSettings
                .ConnectionString;
            return new MyDbContext(connection, true);
        }
    }
    

    为上下文构造函数提供了一个连接,该连接能够以编程方式包含DbProvider。上下文设置为拥有连接,以便它可以在首次使用时打开并在处置时关闭。

    【讨论】:

      【解决方案3】:

      有几种方法可以设置提供程序,但我认为最简单的一种是向 DbContext 类添加一个属性。然后将完整的连接字符串传递给它的构造函数。构造一个 MySqlConnection 对象并将其传递给 DbContext 构造函数。请参阅下面的 EF6 示例代码;

      [DbConfigurationType(typeof(MySqlEFConfiguration))]
      class OrderDb : DbContext
      {
          public virtual DbSet<Order> Orders { get; set; }
      
          public OrderDb(string conStr): base(new MySqlConnection(conStr), true)
          {
          }        
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 2016-04-03
        • 2011-07-22
        相关资源
        最近更新 更多