Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何";“重新多元化”;从.NET 4.5迁移到.NET Core 2.2后的数据库表?_C#_Entity Framework Core_Entity Framework Migrations - Fatal编程技术网

C# 如何";“重新多元化”;从.NET 4.5迁移到.NET Core 2.2后的数据库表?

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迁移到.NET Core,出于某种原因(我不记得了),我想在运行
更新数据库时防止表名的复数化,比如(.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; }
        }