我有一个.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
,还是有其他方法可以解决这个问题?
这些是我的约束:
ASP.NET Core Identity
(以及仅使用EF Core的其他.NET Core库)MySql.Data.Entity
用于EF 6,将Pomelo.EntityFrameworkCore.MySql
用于EF Core。我们曾尝试将其他库用于EF Core,但它们带来了很多错误。我们发现Pomelo是最稳定的。 修改
我认为原因是Pomelo.EntityFrameworkCore.MySql
引用MySqlConnector
具有名称空间/类MySql.Data.MySqlClient.MySqlConnection
,MySql.Data.Entity
也是如此。
答案 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();
}
希望有所帮助