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

我有一个项目要从 .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 那样的复数(似乎无法添加它)。


我在 .NET Core 2.2 中的新 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 中的表(如上所示)已经复数化,因此我无法更改将被跟踪的 DbContext 以获取新的add-migration......我是否只是手动创建一个迁移文件并更新表名,如:


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


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


明月笑刀无情
浏览 118回答 3
3回答

呼啦一阵风

我认为这会有所帮助:&nbsp; &nbsp; public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : base(options)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modelBuilder.Entity<Album>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ToTable("Album");&nbsp; &nbsp; }另一种方法是:[Table("Album")]&nbsp;public class Album&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public int AlbumId { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public string Name { get; set; }&nbsp; &nbsp; }

慕尼黑5688855

好吧,您已经对代码进行了更改,因为您曾经有那行 about&nbsp;Remove<Pluralizing>,但现在没有了。不幸的是,Add-Migration可能不会接受此更改,尤其是当您同时转换为 .Net Core 时。由于您的模型与您的表不匹配,您有以下选择:手动创建更改表名的迁移:migrationBuilder.RenameTable("Album", newName: "Albums");或 2. 直接向 SQL 中的 Db 写入查询以更改表名:EXEC sp_rename 'dbo.Album', 'dbo.Albums';

catspeake

EF Core 2.0 引入了一个新的 IPluralizer 服务,用于单数化实体类型名称和复数化 DbSet 名称。也许你可以调查一下。这里有很多关于这个的帖子或者这里有一篇关于那个的博客文章
打开App,查看更多内容
随时随地看视频慕课网APP