C# 如何";“重新多元化”;从.NET 4.5迁移到.NET Core 2.2后的数据库表?
我有一个项目,我正在从.NET 4.5迁移到.NET Core,出于某种原因(我不记得了),我想在运行C# 如何";“重新多元化”;从.NET 4.5迁移到.NET Core 2.2后的数据库表?,c#,entity-framework-core,entity-framework-migrations,C#,Entity Framework Core,Entity Framework Migrations,我有一个项目,我正在从.NET 4.5迁移到.NET Core,出于某种原因(我不记得了),我想在运行更新数据库时防止表名的复数化,比如(.NET 4.5): 我相信,当我尝试加载页面时,缺少多元化是导致此错误的原因: SqlException: Invalid object name 'Albums'. //further down the stack trace i see UnLink.Services.AlbumService.GetAlbumByStringExt(string st
更新数据库时防止表名的复数化,比如(.NET 4.5):
我相信,当我尝试加载页面时,缺少多元化是导致此错误的原因:
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();
看到了吗?我试图调用\u db.Albums
,但我相信我做不到这一点,因为表不是复数形式的,我的核心上下文也不像.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)
{
}
}
public类ApplicationDbContext:IdentityDbContext
{
公共数据库集相册{get;set;}
公共数据库集艺术家{get;set;}
公共应用程序DBContext(DbContextOptions选项)
:基本(选项)
{
}
}
如何更新表名?我的核心DbContext(如上所示)中的表已经是复数的,因此我无法对DbContext进行更改,因为新的add迁移将跟踪这些表。。。我是否只是手动创建迁移文件并更新表名,如:
migrationBuilder.RenameTable(名称:“艺术家”,模式:“dbo”,新名称:“艺术家”,新模式:“dbo”)代码>
我认为为代码中没有实际更改/跟踪的内容创建迁移不是一个好做法 嗯,您对代码进行了更改,因为您以前有一行关于删除的内容,但现在没有了。不幸的是,addmigration
可能无法接受此更改,尤其是当您同时转换到.Net Core时
由于您的模型与表不匹配,您有以下选项:
手动创建更改表名称的迁移:
migrationBuilder.RenameTable(“相册”,新名称:“相册”)代码>
或
2.在SQL中直接向Db写入查询以更改表名:
EXEC sp_重命名“dbo.Album”、“dbo.Albums”代码>我认为这会有所帮助:
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
modelBuilder.Entity<Album>()
.ToTable("Album");
}
EF Core 2.0引入了一个新的IPluralizer服务,用于对实体类型名称进行单数化,并对数据库集名称进行复数化
也许你可以调查一下。这里有很多关于这方面的帖子,或者一篇关于这方面的博客帖子谢谢,好吧,所以我不得不删除这一行,因为PluralizingTableNameConvention
在Core中不存在。看起来修复会比我想象的更容易,会给这一个快照重命名表是极端的,会破坏访问它们的任何其他东西。只要修正模型。@DavidG,我同意,除了OP说他希望他们在db中是复数,而且这似乎是一个足够小的项目,很可能一切都在通过EF反正。@DavidG就修正模型而言,您可以建议hassan在其回答中提到的在Album
上方添加数据注释,以明确说明其复数名称?有趣!所以这相当于我在.NET 4.5环境中拥有的功能?我不确定,但这个属性可能可以工作[表(“相册”)]
我必须将.ToTable(“相册”)
更改为.ToTable(“相册”)
,才能使它工作,所以一旦您更改了它,我会将@Jordan Lewallen标记为正确的@Jordan Lewallen谢谢你的提示我更改了它。第二个示例中也是表格(“唱片”)!
public class ApplicationDbContext : IdentityDbContext
{
public DbSet<Album> Albums { get; set; }
public DbSet<Artist> Artists { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
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; }
}