我使用Visual Studio 2015开发了一个新的asp.net Core Web应用程序。我正在通过向本地数据库添加其他表来添加用户自定义选项。但是我无法正确地添加任何EF需要查询新表。尝试查询表时出现以下错误。
对ApplicationDbContext应用现有迁移可能会解决此问题
ApplicationDbContext的迁移尚未应用于数据库 •00000000000000_CreateIdentitySchema
应用迁移
在Visual Studio中,您可以使用程序包管理器控制台将挂起的迁移应用于数据库: PM>更新数据库 或者,您可以从项目目录的命令提示符处应用挂起的迁移:
dotnet ef数据库更新
我的表是一个包含一些varchar或nvarchar列的简单表。该模型看起来像......
namespace MyNamespace.ColorSchemes
{
public class ColorSchemesViewModel
{
[Required]
public string Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string bc { get; set; }
}
表在SQL Server中看起来像这样......
CREATE TABLE [dbo].[ColorSchemes](
[Id] [nvarchar](50) NOT NULL,
[Name] [varchar](32) NOT NULL,
[bc] [nchar](7) NOT NULL
)
我已将表添加到应用程序上下文中,例如......
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<ColorSchemesViewModel> Colors { get; set; }
我也像...一样使用单独的类。
public DbSet<ColorSchemes> Colors { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
}
}
我已将上下文添加到这样的控制器......
private ApplicationDbContext _context;
public MyController(IMemoryCache memoryCache, ILoggerFactory loggerFactory, ApplicationDbContext context)
{
_memoryCache = memoryCache;
_logger = loggerFactory.CreateLogger<ChordMVCController>();
_context = context;
}
我试图在我的控制器中查询这样的表......
var colorSchemes = (from c in _context.Colors
select c).ToList();
我已尝试使用程序包管理器来处理错误指示...
PM> Update-Database
我总是收到这个错误...
System.Data.SqlClient.SqlException: There is already an object named 'AspNetRoles' in the database.
这没有意义,因为此表已经在数据库和EF定义中。如何将我的表格正确添加到EF迁移中,以便我可以查询它?
答案 0 :(得分:0)
我自己能够解决这个问题......
我创建了一个不同的上下文,而不是尝试将dbset嵌入到默认的ApplicationDbContext中,并且还删除了onModelCreating方法。
public class ColorSchemeDbContext : DbContext
{
public ColorSchemeDbContext(DbContextOptions<ColorSchemeDbContext> options) : base(options)
{
}
public DbSet<ColorScheme> ColorSchemes { get; set; }
}
将ApplicationDBContext替换为我的控制器类中的新上下文...
private readonly ColorSchemeDbContext _context;
public MyController(IMemoryCache memoryCache, ILoggerFactory loggerFactory, ColorSchemeDbContext context)
{
_memoryCache = memoryCache;
_logger = loggerFactory.CreateLogger<ChordMVCController>();
_context = context;
}
之后查询有效。我花了很多时间尝试使用EF迁移从类语法创建表。似乎没什么用。我在VS 2015中使用模板创建了一个新的.NET CORE Web应用程序,并使用用户身份验证,一旦执行更新数据库,就会在SqlLite中创建AspNetRoles表。如何在此之后使用代码优先方法添加其他表格是非常令人困惑的。关于随着时间的推移管理项目的EF迁移,需要更多的文档。我看到了从VS项目中维护所有数据库更新的好处,但这并不容易理解。