无法使用EF 1.0查询来自asp.net核心Web应用程序的新表

时间:2017-01-07 02:15:37

标签: entity-framework asp.net-core

我使用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迁移中,以便我可以查询它?

1 个答案:

答案 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项目中维护所有数据库更新的好处,但这并不容易理解。