从.NET 4.5迁移到.NET Core 2.2之后,如何“重新复数”数据库表?

时间:2019-04-27 17:53:00

标签: c# entity-framework-core ef-migrations

我有一个项目要从.NET 4.5迁移到.NET Core,出于某种原因(我不记得了),我想在运行{{1}时防止表名的复数}(.NET 4.5):

update-database

因此,当我在SQL Management Studio中查看数据库时,会看到以下内容:

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

}

我认为缺少多元性是导致在尝试加载页面时导致此错误的原因:

//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(); ,但我相信我不能这样做,因为该表未进行复数处理,并且我的Core Context没有像.NET 4.5那样进行复数处理_db.Albums(可以似乎要添加它)。

.NET Core 2.2中我的新DbContext如下所示:

OnModelCreating

如何更新表名?我的Core DbContext中的表(如上所示)已经是复数的,所以我无法更改要为新public class ApplicationDbContext : IdentityDbContext { public DbSet<Album> Albums { get; set; } public DbSet<Artist> Artists { get; set; } public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } } 跟踪的DbContext ...我只是手动创建迁移文件并更新表格名称如下:

add-migration

我认为为代码中未实际更改/跟踪的内容创建迁移不是一种好习惯?

3 个答案:

答案 0 :(得分:2)

我认为这会有所帮助:

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

答案 1 :(得分:0)

好吧,您已经对代码进行了更改,因为您以前在Remove<Pluralizing>的那一行中有此行,但是现在没有。不幸的是,Add-Migration可能无法接受此更改,尤其是当您同时转换为.Net Core时。

由于您的模型与表格不匹配,因此您可以选择以下选项:

  1. 手动创建用于更改表名称的迁移:

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

或 2.将查询直接写入SQL中的Db以更改表名称:

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

答案 2 :(得分:0)

EF Core 2.0引入了一种新的IPluralizer服务,该服务用于将实体类型名称单数化和将DbSet名称复数。

也许您可以调查一下。这里有很多与此相关的帖子,或者here's与此相关的博客帖子