【问题标题】:"How to fix" SqlException: Invalid object name 'Orders'. databatase location?“如何修复”SqlException:无效的对象名称“订单”。数据库位置?
【发布时间】:2019-05-16 13:36:51
【问题描述】:

我按照视频https://docs.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core-ef-step-03?view=vs-2019 中的说明尝试添加产品数据库。经过一些(最初的错误,我第一次崩溃,网站要求我应用迁移,我点击应用)然后它最终起作用了。

说明会告诉您创建一个新的模型文件夹,然后向其中添加一个类。然后在页面折叠中为您的模型添加一个新文件夹,然后是一个新的脚手架项目(带有实体 fw(crud)的剃须刀页面)。然后我添加了以下代码以确保在我的 program.cs 中创建数据库以确保创建数据库

  var host = CreateWebHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    var context = services.GetRequiredService<EisenMNdbContext>();
                    context.Database.EnsureCreated();
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred creating the DB.");
                }
            }

            host.Run();

我认为它适用于产品。 然后我想添加第二个模型/应用程序,称为订单,所以我向模型添加了另一个类,然后创建了另一个文件夹并添加了一个脚手架项目,执行相同的过程,但这次我得到了:

SqlException:无效的对象名称“订单”。

System.Data.SqlClient.SqlCommand+c.b__122_0(任务结果)

我注意到这样的链接

SqlException (0x80131904): Invalid object name 'dbo.Categories'

人们经常将数据库表命名为错误名称。有可以编辑的地方吗?list of file directories

如果有帮助,这里还有一些错误日志:

qlException: Invalid object name 'Orders'.

    System.Data.SqlClient.SqlCommand+<>c.<ExecuteDbDataReaderAsync>b__122_0(Task<SqlDataReader> result)
    System.Threading.Tasks.ContinuationResultTaskFromResultTask<TAntecedentResult, TResult>.InnerInvoke()
    System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, object state)
    System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref Task currentTaskSlot)
    Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteAsync(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary<string, object> parameterValues, CancellationToken cancellationToken)

如果重要的话,我的数据库上下文看起来像这样

    {
        public EisenMNdbContext (DbContextOptions<EisenMNdbContext> options)
            : base(options)
        {
        }

        public DbSet<EisenMN.Models.Product> Products { get; set; }

        public DbSet<EisenMN.Models.Order> Orders { get; set; }


    }
}

【问题讨论】:

  • 数据库中的表名是什么?
  • 我不知道,因为我不知道我创建的数据库在哪里?我假设它的订单,因为那是在我的数据库上下文中,但我不知道。是否有可能永远不会创建表?我只知道我尝试了我为产品所做的事情,但没有成功
  • 请在 sql server management studio 中打开您的数据库进行检查。您可以将 *.mdf 文件导入数据库并检查表名
  • 如果是第二次迁移,可能没有创建表。您需要更新您的数据库。解决此问题的一种快速方法是删除您的数据库并再次运行您的应用程序。然后从文档docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/… 中阅读此内容

标签: c# asp.net sql-server


【解决方案1】:

来自 Migg 的链接帮助了! docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/... 使用 powershell 并确保您已正确应用迁移。

【讨论】:

    【解决方案2】:

    就我而言:

    1. 我把“Database.EnsureCreated();”到我的 dbcontext 构造函数,例如在你的情况下:

    public EisenMNdbContext(DbContextOptions 选项) :基础(选项) {

     Database.EnsureCreated();   // add this to ensure new tables,colums are created
    

    }

    1. 别忘了在终端运行代码,如果发现任何数据库上下文配置更改,它将对您的数据库进行 CRUD。

    dotnet ef 迁移添加 XXXXXXX

    然后,再次运行您的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多