【问题标题】:Unable to query new table from asp.net core web application using EF 1.0无法使用 EF 1.0 从 asp.net 核心 Web 应用程序查询新表
【发布时间】:2017-01-07 02:15:36
【问题描述】:

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

【问题讨论】:

    标签: entity-framework asp.net-core


    【解决方案1】:

    我自己解决了这个问题...

    我创建了一个不同的上下文,而不是尝试将 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 项目维护所有数据库更新的好处,但这并不容易理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2021-05-28
      • 2017-05-25
      • 2017-06-17
      • 2017-05-12
      • 2019-06-26
      相关资源
      最近更新 更多