首页 > 解决方案 > 将 SQlite 和 MySQL 与实体框架一起使用

问题描述

在我们的应用程序中,我们首先使用 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个问题

谢谢你的帮助。

标签: mysqlentity-frameworksqlite

解决方案


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


推荐阅读