我有一个项目,我正在从.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");
我认为为代码中没有实际更改/跟踪的内容创建迁移不是一个好习惯吗?
我认为这可能会有所帮助:
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; }
}
好吧,你已经改变了代码,因为你曾经有关于Remove<Pluralizing>
的那一行,但现在你没有。不幸的是,Add-Migration
可能不会接受这种变化,特别是当你同时转换为.Net Core时。
由于您的模型与您的表不匹配,因此您有以下选项:
migrationBuilder.RenameTable("Album", newName: "Albums");
或2.将查询直接写入SQL中的Db以更改表名:
EXEC sp_rename 'dbo.Album', 'dbo.Albums';
EF Core 2.0引入了一种新的IPluralizer服务,用于单一化实体类型名称和复数DbSet名称。
也许你可以调查一下。关于这个的很多帖子或here's关于此的博客文章