3
votes

Comment «re-pluraliser» les tables de base de données après le passage de .NET 4.5 à .NET Core 2.2?

J'ai un projet que je passe de .NET 4.5 à .NET Core, pour une raison (dont je ne me souviens pas), je voulais empêcher la pluralisation des noms de table lorsque j'ai exécuté une mise à jour -database comme ça (.NET 4.5):

public class ApplicationDbContext : IdentityDbContext
{

    public DbSet<Album> Albums { get; set; }
    public DbSet<Artist> Artists { get; set; }

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

}

Donc, quand je regarde ma base de données dans SQL Management Studio, je vois ce qui suit:

SqlException: Invalid object name 'Albums'.

//further down the stack trace i see
UnLink.Services.AlbumService.GetAlbumByStringExt(string stringExt) in AlbumService.cs
album = _db.Albums.Where(x => x.StringExt == stringExt).FirstOrDefault();

Je pense que le manque de pluralisation est à l'origine de cette erreur lorsque j'essaye de charger une page:

//what I see
dbo.Album
dbo.Artist

//what i want
dbo.Albums
dbo.Artists

Voir? J'essaie d'appeler _db.Albums mais je crois que je ne peux pas faire cela car la table n'est pas pluralisée et mon contexte de base n'a pas de pluralisation OnModelCreating comme mon .NET 4.5 l'a fait (je n'arrive pas à l'ajouter).

Mon nouveau DbContext dans .NET Core 2.2 ressemble à ceci:

public class UncoveredLink : DbContext
{
    //removed constructor for brevity

    public DbSet<Album> Albums { get; set; }
    public DbSet<Artist> Artists { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //the line I'm talking about is here
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

}

Comment puis-je mettre à jour les noms de table? Les tables de mon Core DbContext (comme vu ci-dessus) sont déjà au pluriel, donc je ne peux pas apporter de modification au DbContext qui serait suivi pour une nouvelle migration d'ajout ... est-ce que je crée simplement manuellement un fichier de migration et mettre à jour les noms de table comme:

migrationBuilder.RenameTable (nom: "Artist", schéma: "dbo", newName: "Artists", newSchema: "dbo");

Je pensais que ce n'était pas une bonne pratique de créer une migration pour quelque chose qui n'a pas été réellement changé / suivi dans le code?


3 Réponses :


0
votes

Eh bien, vous avez apporté une modification au code, car vous aviez l'habitude d'avoir cette ligne sur Remove , mais maintenant vous ne l'avez pas. Malheureusement, Add-Migration peut ne pas prendre en compte ce changement, en particulier lorsque vous effectuez une conversion vers .Net Core en même temps.

Étant donné que votre modèle ne correspond pas à vos tableaux, vous disposez des options suivantes:

  1. Créez manuellement une migration qui modifie les noms de table:

migrationBuilder.RenameTable ("Album", newName: "Albums");

OU 2. Écrivez une requête directement dans la base de données en SQL pour changer les noms de table:

EXEC sp_rename 'dbo.Album', 'dbo.Albums';


4 commentaires

Merci, d'accord, j'ai donc dû supprimer cette ligne car PluralizingTableNameConvention n'existait pas dans Core. On dirait que le correctif sera plus facile que je ne le pensais, je vais essayer


Renommer les tables est extrême et cassera tout ce qui y accède. Réparez simplement le modèle.


@DavidG, je serais d'accord, sauf que l'OP a déclaré qu'il voulait qu'ils soient au pluriel dans la base de données, et cela semble être un projet suffisamment petit pour que tout passe par EF de toute façon.


@DavidG En termes de correction du modèle, suggérez-vous ce que hassan a mentionné dans sa réponse sur l'ajout d'une annotation de données au-dessus de Album pour indiquer explicitement son nom au pluriel?



1
votes

Je pense que cela peut être utile:

[Table("Album")]
 public class Album
    {
        public int AlbumId { get; set; }
        public string Name { get; set; }
    }

une autre façon est:

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
    {
          modelBuilder.Entity<Album>()
                        .ToTable("Album");
    }


5 commentaires

Intéressant! Donc, c'est l'équivalent de ce que j'ai dans mon contexte .NET 4.5?


Je ne suis pas sûr mais cet attribut peut peut-être fonctionner


J'ai dû remplacer .ToTable ("Albums") par .ToTable ("Album") pour que cela fonctionne, donc une fois que vous aurez changé cela, je marquerai aussi correct


@ Jordan Lewallen merci pour votre conseil, je l'ai changé.


It’s Table ("Album") aussi sur le deuxième exemple!



0
votes

EF Core 2.0 introduit un nouveau service IPluralizer qui est utilisé pour singulariser les noms de type d'entité et pluraliser les noms DbSet.

Vous pourriez peut-être vous pencher là-dessus. Beaucoup de messages à ce sujet ici ou voici un article de blog à ce sujet


0 commentaires