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

问题描述 投票:1回答:3

我有一个项目,我正在从.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,但我相信我不能这样做,因为表不是多元化的,我的核心上下文没有像我的.NET 4.5那样的多元化OnModelCreating(似乎无法添加它)。

我在.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)
    {
    }

}

如何更新表名?我的Core DbContext中的表(如上所示)已经多元化,因此我无法对将要跟踪新的add-migration的DbContext进行更改...我只是手动创建迁移文件并更新表名称:

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

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

c# entity-framework-core ef-migrations
3个回答
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; }
    }

0
投票

好吧,你已经改变了代码,因为你曾经有关于Remove<Pluralizing>的那一行,但现在你没有。不幸的是,Add-Migration可能不会接受这种变化,特别是当你同时转换为.Net Core时。

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

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

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

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

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


0
投票

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

也许你可以调查一下。关于这个的很多帖子或here's关于此的博客文章

© www.soinside.com 2019 - 2024. All rights reserved.