0

.NET 코어 프로젝트 (.NET 4.6을 대상으로합니다)에서 EF Core와 EF 6을 모두 사용해야하는 곳이 있습니다. MySQL을 사용하기 때문에 내 project.json이 뭔가 보입니다 이 같은 :.NET 핵심 프로젝트 .json에서 종속성 충돌 처리

{ 
    ... 
    "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 6 필요

  • ASP.NET Core Identity (전용 EF 코어를 사용하고 다른 .NET 핵심 라이브러리)을 사용하기 때문에 우리는 그 순간이 발견 이후는 EF 코어를 필요로

    • 을 :

      이러한 내 제약입니다 MySQL을위한 EF 핵심 구현은 우리가 필요로하는 모든 것에 적합합니다.

    • MySQL을 사용하고 있으므로 EF 6에는 MySql.Data.Entity을, EF 코어에는 Pomelo.EntityFrameworkCore.MySql을 사용해야합니다. 우리는 EF Core를 위해 다른 라이브러리를 사용하려고 시도했지만 많은 버그가 있습니다. Pomelo가 가장 안정적인 것으로 나타났습니다.

    편집 : 내가 생각하는 이유는 그 네임 스페이스/클래스 MySql.Data.MySqlClient.MySqlConnection을 가지고 있으며, 그래서 MySql.Data.Entity을 수행 Pomelo.EntityFrameworkCore.MySql 참조 MySqlConnector.

    #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 인터페이스에서 상속이 객체를 생성 :

  • +0

    전체 네임 스페이스를 사용하는 데 도움이 희망? – DavidG

    +0

    @DavidG 전체 네임 스페이스는'MySql.Data.MySqlClient.MySqlConnection'이지만'MySql.Data.MySqlClient'가 두 패키지에 모두 존재하기 때문에 작동하지 않습니다. – Joel

    +0

    코드를 필요한 클래스의 단일 버전 만 참조하는 자체 프로젝트로 옮겨서이 문제를 해결할 수 있습니다. – DavidG

    답변

    0

    당신은 다음 코드에서이 같은 인터페이스를 할 수 있습니다 project.json

    "frameworks": { 
        "netstandard1.6": { 
         "imports": "dnxcore50", 
         "dependencies": { 
         // Your .NET Core dependencies 
         } 
        }, 
    
        "net461": { 
         "dependencies": { 
          // Your .NET 4.6.1 dependencies 
         } 
        } 
        } 
    

    에 그런 일을 할 수 있습니다. 앱에서 .NET 4.6.1에 대한 하나의 및 .NET 코어의 다른

    .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 핵심 마지막으로 *

    // 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(); 
    }