为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
明月笑刀无情 2022-12-31 13:54:47
我有一个项目要从 .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 seedbo.Albumdbo.Artist//what i wantdbo.Albumsdbo.Artists我相信缺少复数是导致我尝试加载页面时出现此错误的原因:SqlException: Invalid object name 'Albums'.//further down the stack trace i seeUnLink.Services.AlbumService.GetAlbumByStringExt(string stringExt) in AlbumService.csalbum = _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");我认为为代码中实际未更改/跟踪的内容创建迁移不是好的做法?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我认为这会有所帮助:


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

    }


查看完整回答
反对 回复 2022-12-31
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

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

由于您的模型与您的表不匹配,您有以下选择:

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

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

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

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


查看完整回答
反对 回复 2022-12-31
?
catspeake

TA贡献1111条经验 获得超0个赞

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

也许你可以调查一下。这里有很多关于这个的帖子或者这里有一篇关于那个的博客文章


查看完整回答
反对 回复 2022-12-31
  • 3 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信