Как «перенастроить» таблицы базы данных после перехода с .NET 4.5 на .NET Core 2.2? - PullRequest
3 голосов
/ 27 апреля 2019

У меня есть проект, который я перехожу из .NET 4.5 в .NET Core, по какой-то причине (я не могу вспомнить), я хотел предотвратить множественное использование имен таблиц, когда я запустил update-database какИтак (.NET 4.5):

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>();
    }

}

Итак, когда я смотрю на свою базу данных в SQL Management Studio, я вижу следующее:

//what I see
dbo.Album
dbo.Artist

//what i want
dbo.Albums
dbo.Artists

Я считаю, что отсутствие плюрализации - вот чтовызывает эту ошибку при попытке загрузить страницу:

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();

Видите?Я пытаюсь позвонить _db.Albums, но считаю, что не могу этого сделать, потому что таблица не является плюрализированной, а мой базовый контекст не имеет плюрализации OnModelCreating, как в моем .NET 4.5 (кажется, не могу добавитьЭто).

Мой новый DbContext в .NET Core 2.2 выглядит следующим образом:

public class ApplicationDbContext : IdentityDbContext
{

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

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

}

Как мне обновить имена таблиц?Таблицы в моем базовом DbContext (как показано выше) уже являются множественными, поэтому я не могу внести изменения в DbContext, которые будут отслеживаться для нового add-migration ... я просто вручную создаю файл миграции и обновляю таблицутакие имена, как:

migrationBuilder.RenameTable(name: "Artist", schema: "dbo", newName: "Artists", newSchema: "dbo");

Я думал, что не стоит создавать миграцию для чего-то, что на самом деле не было изменено / отслежено в коде?

Ответы [ 3 ]

1 голос
/ 27 апреля 2019

Я думаю, что это может быть полезно:

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

другой способ:

[Table("Album")]
 public class Album
    {
        public int AlbumId { get; set; }
        public string Name { get; set; }
    }
0 голосов
/ 29 апреля 2019

EF Core 2.0 представляет новую службу IPluralizer, которая используется для сингулярности имен типов сущностей и множественных имен DbSet.

Может быть, вы могли бы посмотреть на это. Множество сообщений об этом здесь или здесь пост в блоге об этом

0 голосов
/ 27 апреля 2019

Ну, вы внесли изменения в код, потому что раньше у вас была эта строка около Remove<Pluralizing>, а теперь нет. К сожалению, Add-Migration может не принять это изменение, особенно при одновременном преобразовании в .Net Core.

Поскольку ваша модель не соответствует вашим таблицам, у вас есть следующие опции:

  1. Вручную создайте миграцию, которая изменяет имена таблиц:

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

OR 2. Напишите запрос непосредственно в БД в SQL, чтобы изменить имена таблиц:

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

...