处理.NET Core project.json中的依赖冲突

时间:2017-02-27 15:53:10

标签: mysql entity-framework .net-core entity-framework-core project.json

我有一个.NET Core项目(针对.NET 4.6),我必须同时使用EF Core和EF 6.由于我也使用MySQL,我的project.json看起来像这样:< / p>

{
    ...
    "dependencies": {
        "EntityFramework": "6.1.3", // For EF 6
        "MySql.Data.Entity": "6.9.9", // For EF 6 and MySQL
        "Pomelo.EntityFrameworkCore.MySql": "1.1.0", // For EF Core
        ...
    },
    "frameworks": {
        "net461": {}
    },
    ...
}

问题是当我尝试使用类MySqlConnection这样的时候:

var connection = new MySqlConnection(connectionString);

我收到以下错误:

The type 'MySqlConnection' exists in both 
'MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' and
'MySqlConnector, Version=0.7.2.0, Culture=neutral, PublicKeyToken=null'

有没有办法让我准确指定我想要使用哪个库MySqlConnection,还是有其他方法可以解决这个问题?

这些是我的约束:

  • 我需要EF Core,因为我们使用ASP.NET Core Identity(以及仅使用EF Core的其他.NET Core库)
  • 我需要EF 6,因为我们发现目前还没有适用于我们所有需求的EF Core实现。
  • 由于我们使用的是MySQL,因此我需要将MySql.Data.Entity用于EF 6,将Pomelo.EntityFrameworkCore.MySql用于EF Core。我们曾尝试将其他库用于EF Core,但它们带来了很多错误。我们发现Pomelo是最稳定的。

修改 我认为原因是Pomelo.EntityFrameworkCore.MySql引用MySqlConnector具有名称空间/类MySql.Data.MySqlClient.MySqlConnectionMySql.Data.Entity也是如此。

1 个答案:

答案 0 :(得分:0)

你可以在project.json

中做类似的事情
"frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50",
      "dependencies": {
        // Your .NET Core dependencies
      }
    },

    "net461": {
      "dependencies": {
           // Your .NET 4.6.1 dependencies
      }
    }
  }

然后在您的代码中,您可以执行以下界面:

#if NET461
// put your EF usings for .NET 4.6.1 here
#else
// put your EFCore usings for .NET Core
#endif

public interface IDatabase
{
    void Initialize();
    DbContext GetContext();
}

然后创建两个继承自IDatabase接口的对象。一个用于.NET 4.6.1,另一个用于.NET Core

.NET 4.6.1

#if NET461
// put your usings for EF for net461

public class Database461 : IDatabase
{
    private DbContext context;

    public Database461(DbContext context)
    {
        // ...
    }

    public void Initialize()
    {
        // initialize stuff if you want
    }

    public DbContext GetContext()
    {
        return this.context;
    }
}

#endif

.NET Core *

// notice here that i've put a "!" that means "not"
#if !NET461
// put your usings for EF Core

public class DatabaseNetCore : IDatabase
{
    private DbContext context;

    public DatabaseNetCore (DbContext context)
    {
        // ...
    }

    public void Initialize()
    {
        // initialize stuff if you want
    }

    public DbContext GetContext()
    {
        return this.context;
    }
}

#endif

最后,在您的应用中,您将使用上述两个对象之一在启动时初始化您的IDatabase对象,并执行您想要的任何操作。

// At startup, somewhere in your app...
static IDatabase database;
public InitializeDatabase()
{
#if !NET461
    database = new DatabaseNetCore(...);
#else
    database = new Database461(...);
#endif

    database.Initialize();
}

希望有所帮助