148 votes

EntityTypeBuilder ne contient pas de définition pour ToTable dans EF Core

J'ai ce code d'exemple:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Models;

namespace MySampleNamespace
{
    public class MyDbContext : DbContext
    {
        public MyDbContext(DbContextOptions options)
            : base(options)
        {
        }

        public DbSet Users { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            new UserMap(modelBuilder.Entity());
        }

        public class UserMap
        {
            public UserMap(EntityTypeBuilder entityBuilder)
            {
                entityBuilder.ToTable("User");
                entityBuilder.Property(s => s.Username).HasMaxLength(15).IsRequired();
            }
        }
    }
}

J'essayais un exemple du site MS, mais je ne trouve pas la méthode ToTable. Dans l'exemple, j'ai vérifié les directives Using et la seule directive Using présente dans l'exemple est Microsoft.EntityFrameworkCore en dehors du projet de classe pour le modèle qu'il utilisait. Est-ce que cela a changé? Comment puis-je faire cela maintenant?

49 votes

Assurez-vous d'avoir une référence à l'assembly Microsoft.EntityFrameworkCore.Relational. Les usings sont corrects - la méthode en question est une méthode d'extension définie dans la classe RelationalEntityTypeBuilderExtensions sous le namespace Microsoft.EntityFrameworkCore dans cet assembly.

307voto

Mardoxx Points 2246

Installer Microsoft.EntityFrameworkCore.Relational est la solution correcte, comme le dit Ivan.

1 votes

@GertArnold a corrigé

1 votes

HasColumnName est également dans ce package nuget. Je migrais du code DotNet Framework et je pensais devenir fou. Merci! nuget.org/packages/Microsoft.EntityFrameworkCore.Relational

1 votes

Je n'ai aucune idée de pourquoi l'intellisense ne parvient pas à suggérer ce package nuget manquant. Soit laissez les utilisateurs ajouter tous les packages manuellement, soit fonctionnez parfaitement. Mauvais intellisense.

14voto

GreenyMcDuff Points 470

J'ai eu ce problème, mais je n'avais pas besoin d'installer:

Microsoft.EntityFrameworkCore.Relational

J'ai simplement quitté Visual Studio 2017 et rouvert ma solution. J'avais les packages NuGet suivants installés:

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools

Et la référence à l'outil CLI suivante:

Microsoft.EntityFrameworkCore.Tools.DotNet

9voto

Tom Stickel Points 4201

Ivan & Mardoxx ont raison.

J'ai essayé d'installer simplement Microsoft.EntityFrameworkCore.Tools puis j'ai obtenu cette erreur :

Détection d'une rétrogradation de package : Microsoft.EntityFrameworkCore de la version 2.1.4 à la version 2.1.1. Faites référence directement au package depuis le projet pour sélectionner une version différente. -> Microsoft.EntityFrameworkCore.Tools 2.1.4 -> Microsoft.EntityFrameworkCore.Design 2.1.4 -> Microsoft.EntityFrameworkCore.Relational 2.1.4 -> Microsoft.EntityFrameworkCore (>= 2.1.4) -> Microsoft.EntityFrameworkCore (>= 2.1.1)

  1. J'ai mis à jour Microsoft.EntityFrameworkCore via NuGet
  2. J'ai installé Microsoft.EntityFrameworkCore.Tools qui n'a pas fonctionné pour ToTable, inconnu si cela est même nécessaire
  3. J'ai ensuite installé Microsoft.EntityFrameworkCore.Relational et cela fonctionne désormais

1 votes

J'ai également suivi vos étapes et mis à niveau netcoreapp3.0 de netcoreapp2.1. Maintenant, Microsoft.EntityFrameworkCore.Tools et Microsoft.EntityFrameworkCore.Relational sont installés avec succès, mais l'instruction d'utilisation ne montre pas d'espace de noms "Relational" après Microsoft.EntityFrameworkCore et donc je ne peux pas utiliser MapToStoredProcedures :S

8voto

Pasi Savolainen Points 1489

En migrant de EF6 à EFCore, nous avons rencontré ce problème. Notre problème était que .HasKey renvoie maintenant un KeyBuilder et le .ToTable n'opère pas dessus. Donc en inversant cela a fonctionné.

À savoir :

mp.HasKey(m => m.Id)
  .ToTable("Table")

Devenu :

mp.ToTable("Table")
  .HasKey(m => m.Id);

0 votes

Travailler maintenant, c'était ça pour moi.

1voto

McEmmy Points 444

En fonction de la version de votre .Net que vous utilisez. Microsoft.EntityFrameworkCore.Tools.DotNet ne prend en charge que .NetStandard >= 2.0.

Si votre version de .Net est 4.6.1, mettez à jour Microsoft.EntityFrameworkCore en 2.0.0-preview1-final, ainsi que les DLLs EntityFramework associées, puis fermez Visual Studio 2017 et rouvrez-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X