【问题标题】:Use SQlite and MySQL with entity framework将 SQlite 和 MySQL 与实体框架一起使用
【发布时间】:2020-10-21 14:00:26
【问题描述】:

在我们的应用程序中,我们首先使用 Database 和 SQlite 数据库。

在程序中我们使用这个方法来获取实体

public static SidelDataStoreEntities CreateEntitiesForSpecificSqliteDatabaseName(string databaseName)
    {
        var connection = new EntityConnectionStringBuilder()
        {
            Metadata = metadata,
            Provider = "System.Data.SQLite.EF6",
            ProviderConnectionString = new SqlConnectionStringBuilder() { DataSource = databaseName, }.ConnectionString,
        };
        sidelDataStoreEntities = new SidelDataStoreEntities(connection.ConnectionString);
        return sidelDataStoreEntities;
    }

现在我们也希望能够使用 MySQL。这是完全相同的表。 我们使用这种方法来获取实体。

    public static SidelDataStoreEntities CreateEntitiesForMySqlServer()
        {
            var connection = new EntityConnectionStringBuilder()
            {
                Metadata = metadata,
                Provider = "MySql.Data.MySqlClient",
                ProviderConnectionString = new MySqlConnectionStringBuilder()
                {
                    Database = "datastore",
                    Server = Settings.Default.DataBaseServer,
                    IntegratedSecurity = false,
                    UserID = GetUserId(),
                    Password = GetPassword()
                }.ConnectionString,
            };
            sidelDataStoreEntities = new SidelDataStoreEntities(connection.ConnectionString);
            return sidelDataStoreEntities;
}

在 App.config 中我们有

<entityFramework>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.22.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>

但是当我们使用 MySQL 数据库时,当我们想要使用实体时,我们会收到此消息

System.InvalidCastException: '无法将'MySql.Data.MySqlClient.MySqlConnection' 类型的对象转换为'System.Data.SQLite.SQLiteConnection' 类型。'

关键似乎是属性

[DbConfigurationType(typeof(MySqlEFConfiguration))]

如果我们将它与 MySql 一起使用,我们会因为“sideldatastoremodelstorecontainer”而出现另一个错误。添加在表名中

  • InnerException  {"Table 'datastore.sideldatastoremodelstorecontainer.databasemetadata' doesn't
    

存在"} System.Exception {MySql.Data.MySqlClient.MySqlException}

如果我们使用 SQlite 数据库,这个属性会产生运行时错误

所以我们有 2 个问题

  • 如何仅对 MySQL db 使用该属性?
  • 对于 MySQL db,如何抑制表名中的附加字符

感谢您的帮助。

【问题讨论】:

标签: mysql entity-framework sqlite


【解决方案1】:

第一个问题的答案是

    TypeDescriptor.AddAttributes(typeof(SidelDataStoreEntities), new DbConfigurationTypeAttribute(typeof(MySqlEFConfiguration)));
    var x = TypeDescriptor.GetAttributes(typeof(SidelDataStoreEntities));

但不幸的是,正如我们在 GetAttributes 中看到的那样,新属性是在已经存在的属性之后添加的。并且在这种情况下,两个属性的顺序是不同的。看起来,只使用了第一个。因此,我们恢复了关于演员表的第一个错误。

第一个问题的正确答案终于来了 How to choose DbConfigurationType programmatically?

【讨论】:

    【解决方案2】:

    对于第二个问题,问题在于连接器和 NuGet 包之间的版本不同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2010-09-09
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多