Не удается найти метод UseMysql в DbContextOptions

#c# #mysql #entity-framework #asp.net-core

#c# #mysql #entity-framework #asp.net-core

Вопрос:

Я играю с ядром dotnet в Linux и пытаюсь настроить свой DbContext с помощью строки подключения к серверу mysql.

мой DbContext выглядит так:

 using Microsoft.EntityFrameworkCore;
using Models.Entities;

namespace Models {
    public class SomeContext : DbContext
    {
        //alot of dbSets...
        public DbSet<SomeEntity> SomeDbSet { get; set; }

        public SomeContext(DbContextOptions<SomeContext> options) : base(options) {
            
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
        {
            optionsBuilder.UseMysql //Cannot find this method
        }
        
        
        protected override void OnModelCreating(ModelBuilder modelBuilder) 
        {
            //using modelBuilder to map some relationships
        }
    }
}
 

Мои зависимости выглядят так:

 "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Configuration.CommandLine": "1.0.0",
    "Microsoft.AspNetCore.Mvc":"1.0.0",
    "Microsoft.EntityFrameworkCore": "1.0.1",
    "MySql.Data.Core": "7.0.4-ir-191",
    "MySql.Data.EntityFrameworkCore": "7.0.4-ir-191"
  },
 

Я также попытался использовать сервер mysql в моем Startup.cs в следующем коде

 public class Startup
    {
       
        public void ConfigureServices(IServiceCollection services)
        {
            var connection = @"Server=(localdb)mssqllocaldb;Database=EFGetStarted.AspNetCore.NewDb;Trusted_Connection=True;";
            services.AddDbContext<SomeContext>(options => options.UseMysql); //Cannot find UseMysql*
        }
 

Я попытался изменить свою директиву с

 using Microsoft.EntityFrameworkCore;
 

Для

 using MySQL.Data.EntityFrameworkCore;
 

Что имеет смысл? может быть? но тогда все ссылки на DbContext и DbSet исчезают, поэтому я полагаю, что решение представляет собой смесь видов??

Ответ №1:

Вам нужно

 using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore.Extensions;
 

Oracle не соответствует стандартным методам при использовании внедрения зависимостей, поэтому все немного по-другому. Стандартная практика заключается в том, чтобы поместить методы расширения для внедрения Depedency в Microsoft.Extensions.DependencyInjection пространство имен, которое включено в большинство ASP.NET Основные проекты приложений, поэтому метод становится автоматически доступным при импорте пакета.

Комментарии:

1. Как вы выяснили, что MySQL.Data.EntityFrameworkCore.Extensions был точным «using statement», который вы должны были использовать??

2. Эй, Oracle никак не может поместить свой код в Microsoft.* пространство имен 🙂

3. @IvanStoev: это не какой-либо специфичный для фреймворка код, а просто методы расширения, которые используются для внедрения / регистрации поставщика Mysql, поэтому Microsoft.Extension.DependencyInjection он идеально подходит для него, потому что код очень специфичен для внедрения зависимостей, введенных в (ASP). NET Core

4. @DenLilleMand: Общепринятое соглашение об именовании заключается в том, чтобы помещать методы расширения в вызываемое пространство имен .Extensions , чтобы их можно было импортировать по требованию и иным образом исключать.

5. @Tseng Я просто пошутил.

Ответ №2:

Используйте приведенный ниже код, если вы ссылаетесь на пакет Pomelo.EntityFrameworkCore.MySQL

  services.AddDbContextPool<AppDBContext>(options =>
        {
            var connetionString = Configuration.GetConnectionString("DefaultConnection");
            options.UseMySql(connetionString, ServerVersion.AutoDetect(connetionString));
        });
 

Ответ №3:

Будущие читатели.

Если вы используете «MySQL.Data.EntityFrameworkCore»:

У меня есть это: (обратите внимание, случай любого слова / фразы, содержащего «MySQL«.)

В моем верхнем слое (обычно .exe), где я выполняю настройку DI.

csproj (верхний уровень)

 <PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.19" />
 

cs-файл с DI

 using Microsoft.EntityFrameworkCore;
using MySql.Data.EntityFrameworkCore;


///where servColl is IServiceCollection 
servColl.AddDbContext<MyCoolDbContext>(options => options.UseMySQL("server=localhost;database=library;user=mysqlschema;password=mypassword"));
 

ОБРАТИТЕ внимание на СЛУЧАЙ использования UseMySQL. Почему пространство имен — «MySQL», а «use» — «UseMySQL» (??)…… это несоответствие (с корпусом) стоит отметить, если вы бьетесь головой об экран. 🙂

и на «нижнем уровне» (мой «уровень данных»), где я кодирую ядро EntityFramework (но не какой-либо конкретный конкретный)

csproj (уровень данных) (обратите внимание на версии 2.1 …….)

 <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.*" />
 

======================================

ЕСЛИ вы используете Pomelo.EntityFrameworkCore.MySQL. (Что я лично считаю лучшим вариантом.)

В моем верхнем слое (обычно .exe), где я выполняю настройку DI.

csproj (верхний уровень)

  <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.*" />
 

cs-файл с DI

 using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;


///where servColl is IServiceCollection 
servColl.AddDbContext<MyCoolDbContext>(options => options.UseMySql("server=localhost;database=library;user=mysqlschema;password=mypassword"));
 

ОБРАТИТЕ внимание на СЛУЧАЙ использования UseMySql. Это согласуется. Итак, бонусные баллы за Помело.EntityFrameworkCore.MySQL для согласованности между «using (namepsace)» и регистрацией DI «UseMySql».

и на «нижнем уровне» (мой «уровень данных»), где я кодирую ядро EntityFramework (но не какой-либо конкретный конкретный)

csproj (уровень данных)

 <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.*" />
 

Ответ №4:

Если вы не используете MySQL.Data.EntityFrameworkCore package. Возможно, вы используете Pomelo.EntityFrameworkCore.MySql пакет для MySQL в EntityFramework Core.

Если да, добавьте эти строки:

 using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore;