Estoy tratando de agregar un nuevo usuario a la base de datos con el siguiente código:
public async void SeedUsers(){ int count=0; if(count>0){ return; } else{ string email="jujusafadinha@outlook.com.br"; _context.Add(new User{LoginEmail=email}); await _context.SaveChangesAsync(); } }Pero me sigue dando el siguiente error:
System.TypeLoadException: el método 'Create' en el tipo 'MySql.Data.EntityFrameworkCore.Query.Internal.MySQLSqlTranslatingExpressionVisitorFactory' from >assembly 'MySql.Data.EntityFrameworkCore, Version=8.0.22.0, Culture=neutral, >PublicKeyToken=c5687fc88969c44d' no tener una implementación. en MySql.Data.EntityFrameworkCore.Extensions.MySQLServiceCollectionExtensions.AddEntityFrameworkMySQL(IServ>iceCollection services) en MySql.Data.EntityFrameworkCore.Infrastructure.Internal.MySQLOptionsExtension.ApplyServices(IServiceColle>ction services) en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.ApplyServiceOptions(IDb >opciones, servicios de ServiceCollection) en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<c__DisplayClass4_0.g__BuildServiceProvider|3() en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.b__2(Int64 k) en System.Collections.Concurrent.ConcurrentDictionary
2.GetOrAdd(TKey key, Func2 valueFactory) en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions options, >Boolean providerRequired) en Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() en Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() en Microsoft .EntityFrameworkCore.DbC ontext.EntryWithoutDetectChanges[TEntity](entidad TEntity) en Microsoft.EntityFrameworkCore.DbContext.SetEntityState[TEntity](entidad TEntity, EntityState >entityState) en Microsoft.EntityFrameworkCore.DbContext.Add[TEntity](entidad TEntity) en contatinApi.Data.SeedData .SeedUsers() en D:\dev\contatinapi\Data\SeedData.cs:línea 24 en System.Threading.Tasks.Task.<>c.b__139_1(Object state) en System.Threading.QueueUserWorkItemCallback.<>c.< .cctor>b__6_0(QueueUserWorkItemCallback quwi) en System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext >executionContext, Action`1 callback, TState& state) en System.Threading.QueueUserWorkItemCallback.Execute() en System.Threading.ThreadPoolWorkQueue.Dispatch () en System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
La clase de usuario:
public class User { public int Id{get;set;} public string LoginEmail{get;set;} public string UserName{get;set;} public DateTime CreatedAt{get;set;} public List<Contact> Contacts {get;set;} public List<ContactList> ContactLists{get;set;} }Se actualizan los paquetes EF Core y MySQL. Además, probé usando procedimientos almacenados y dio los mismos resultados.
El contenido de Ex era:
El valor de Ex era {System.TypeLoadException: Método 'Crear' en el tipo 'MySql.Data.EntityFrameworkCore.Query.Internal.MySQLSqlTranslatingExpressionVisitorFactory' del ensamblado 'MySql.Data.EntityFrameworkCore, Version=8.0.22.0, Culture=neutral, PublicKeyToken= c5687fc88969c44d' no tiene implementación. en MySql.Data.EntityFrameworkCore.Extensions.MySQLServiceCollectionExtensions.AddEntityFrameworkMySQL(IServiceCollection services) en MySql.Data.EntityFrameworkCore.Infrastructure.Internal.MySQLOptionsExtension.ApplyServices(IServiceCollection services) en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.ApplyServiceOptions(IDbContextOptions) ) en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.g__BuildServiceProvider|3() en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.b__2(Int64 k) en System.Collections.Concurrent.ConcurrentDictionary
2.GetOrAdd(TKey key, Func2 valueFactory) en Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions options, Boolean providerRequired) en Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() en Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() en Microsoft.EntityFrameworkCore.DbCont ext.Microsoft.EntityFrameworkCore.Internal.IDbContextDependencies.get_StateManager() en Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.EntryWithoutDetectChanges(TEntity entity) at Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.Add(entidad de TEntity) en contatinApi.Data.SeedData. SeedUsers() en D:\dev\ContatinApi\Data\SeedData.cs:line 40}
Tratar:
_context.Users.Add(new User{LoginEmail=email, CreatedAt=DateTime.Now }); await _context.SaveChangesAsync(); or better try { var newUser= new User{LoginEmail=email, CreatedAt=DateTime.Now }; _context.Users.Add(newUser); await _context.SaveChangesAsync(); } catch (Exception ex) { var errorMessage = ex.Message; } in this case you can get a new key if you need;ACTUALIZAR:
instead of _context.Users.Add(newUser); Try: _context.Entry(newUser).State = EntityState.Added;Pero, ¿por qué su ID de su clase de Usuario no tiene el atributo [Clave] y CreateDate no tiene el atributo [Columna (TypeName = "datetime")]? ¿Qué tipo de validaciones tiene? ¿Puede publicar algo de _context que sea relevante para el usuario?
Si está utilizando Microsoft.EntityFrameworkCore 5.0, descárguelo a Microsoft.EntityFrameworkCore 3.1.10 MySQL EF 8.0.22 actualmente no es compatible con Microsoft.EntityFrameworkCore 5.0
Tengo un código que funciona hasta que actualicé a Microsoft.EntityFrameworkCore 5.0, luego recibí el mismo error, ¡bajé de categoría y funcionó!
Con la esperanza de publicar un informe de errores en MySQL Bug Forum
Mientras seguía un tutorial de EF Core para MySql usando Migraciones y obtenía el error "El método 'Crear' no tiene una implementación" y buscaba mucho en Google, bajé mi archivo csproj de net5.0 a netcoreapp3.1:
<TargetFramework>netcoreapp3.1</TargetFramework>E incluyó los siguientes paquetes de Nuget usando comandos de terminal dotnet dentro del directorio del proyecto:
dotnet add package Pomelo.EntityFrameworkCore.MySql --version 5.0.0-alpha.2 ... dotnet list package Project 'XYZ' has the following package references [netcoreapp3.1]: Top-level Package Requested Resolved > Microsoft.EntityFrameworkCore 5.0.1 5.0.1 > Microsoft.EntityFrameworkCore.Design 5.0.1 5.0.1 > Microsoft.EntityFrameworkCore.Tools 5.0.1 5.0.1 > Pomelo.EntityFrameworkCore.MySql 5.0.0-alpha.2 5.0.0-alpha.2Como ejemplo, uno de los archivos del modelo es Student.cs:
namespace EFCoreTutorial.Model { public class Student { public int StudentId { get; set; } public string Name { get; set; } } }Creé el archivo de contexto db SchoolContext.cs con mi cadena de conexión personal como:
using Microsoft.EntityFrameworkCore; using Pomelo.EntityFrameworkCore.MySql.Infrastructure; namespace EFCoreTutorial.Data { public class SchoolContext : DbContext { public DbSet<Model.Student> Students { get; set; } public DbSet<Model.Course> Courses { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { string connectionString = "server=localhost;port=3306;database=SchoolDB;user=root;password=******"; optionsBuilder.UseMySql(connectionString, new MySqlServerVersion(new System.Version(8, 0, 22)), mySqlOptions => mySqlOptions.CharSetBehavior(CharSetBehavior.NeverAppend)); } } }luego puede crear la base de datos y las tablas vacías definidas en el Modelo con
dotnet ef migrations add CreateSchoolDB <- just a label dotnet ef migrations list <- to verify it is pending dotnet ef database update <- the database will be created/updated dotnet ef migrations list <- to verifyfinalmente verifique en mysql:
mysql> show databases; mysql> use SchoolDB; mysql> show tables;¡Éxito! La base de datos y las tablas se crearon completamente a partir de los modelos y la definición del contexto de la base de datos.
He resuelto este problema siguiendo esto: -
actualizar Microsoft.EntityFrameworkCore a la versión 5.0.1
actualice Pomelo.EntityFrameworkCore.MySql a la versión 5.0.0-alpha.2
agregue los bloques de código en el método ConfigureServices del archivo Startup.cs
var connectionString = _configuration.GetConnectionString("userDB"); services.AddDbContext(opciones =>
options.UseMySql(connectionString,new MySqlServerVersion(nueva versión(10, 1, 40)), mySqlOptions => mySqlOptions .CharSetBehavior(CharSetBehavior.NeverAppend)));
Para obtener la versión del servidor mysql, ejecute la consulta en cualquiera de los editores del servidor mysql como MySql Workbench o HeidiSQL
SELECT VERSION()Instale el siguiente paquete nuget para el controlador MySql desde Pomelo.EntityFrameworkCore.MySql
Otros paquetes de Nuget serán:
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.10" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.10" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.10"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.22" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.1" />Ejecute el siguiente comando para obtener la versión de su MySql
SELECT VERSION()En Startup.cs agregue los siguientes espacios de nombres:
using System; using IdentityWithEFPlayground.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Pomelo.EntityFrameworkCore.MySql;En el método ConfigureServices de Startup.cs, agregue el siguiente código:
var serverVersion = new MySqlServerVersion(new Version(8, 0, 26)); // Get the value from SELECT VERSION() string connectionString = Configuration.GetConnectionString("DefaultConnection"); services.AddDbContext<AppDBContext>(c => c.UseMySql(connectionString, serverVersion)); services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<AppDBContext>();En la Terminal, ejecute el siguiente comando para actualizar/crear la base de datos a través de Migraciones de EF:
dotnet ef migrations add IdentityUser dotnet ef database updateVerá las tablas de identidad de ASP.NET en su base de datos: