#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 Core4. @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;