【问题标题】:SQLite data context in AspNetCore app not workingAspNetCore 应用程序中的 SQLite 数据上下文不起作用
【发布时间】:2020-03-29 23:20:49
【问题描述】:

我一直在尝试使用 Visual Studio 2019 和 Entity Framework Core 中的最新脚手架在我的单页 Web 应用程序中实现数据访问。我正在使用 SDK 版本 3.1.100。一切都构建并运行,但我收到一个运行时异常,声称“没有这样的表:用户”。这让我觉得EF核心和数据库之间的连接很好。可能是其他任何东西,因为我在调试方面运气不佳。我的 SQLite 数据库文件和 sqlite3.dll 包含在项目中,并且将属性设置为复制到输出。相关代码部分如下:

appsettings.json:

{
  "ConnectionStrings": {
    "Sqlite": "Data Source=HopeApp.db"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

在 Startup.cs 中的 ConfigureServices 中添加了以下内容:

services.AddEntityFrameworkSqlite()
    .AddDbContext<DatabaseContext>(options =>
          options.UseSqlite(Configuration.GetConnectionString("Sqlite"))); 

数据库上下文:

public class DatabaseContext: DbContext
  {
    public  DbSet<datUser> User { get; set; }
    public  DbSet<datIESum> IESum { get; set; }

    //
    // https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
    //
    public DatabaseContext(DbContextOptions<DatabaseContext> options)
            : base(options) {    }

  }

最后,尝试检索数据的控制器:

[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
private readonly DatabaseContext db;

public UserController(DatabaseContext db)
{
  this.db = db;
}

[HttpGet]
public IEnumerable<datUser> Get()
{
  List<datUser> users = new List<datUser>();

  using (this.db)
  {
    foreach (var user in this.db.User)
    {
      users.Append(user);
    }
  }

  return users;
  }
}

我检查了 DB Brower 中的 SQLite .db 文件,查看表是否存在并验证数据是否存在。我已经检查了文件权限,所以每个人都可以完全控制。我不知道还要检查什么来追踪它。请注意,这些天的大多数示例都是作为“代码优先”而不是“数据库优先”提供的,这对我的应用程序来说效果更好。

这是 HopeApp.db 的屏幕截图:

错误:

An exception of type 'Microsoft.Data.Sqlite.SqliteException' occurred in
Microsoft.EntityFrameworkCore.Relational.dll but was not handled in user code
SQLite Error 1: 'no such table: User'.

有什么想法或调试建议吗?我可以提供更多信息吗?

【问题讨论】:

    标签: sqlite .net-core entity-framework-core


    【解决方案1】:

    错误提示找不到表User,但数据库文件有表datUser

    数据库上下文中的属性名称决定了预期的表名称。重命名以匹配,更改数据库文件以匹配或使用流式 API 在两者之间进行映射。

    更多信息可以在这里找到:https://docs.microsoft.com/en-us/ef/core/modeling/relational/tables

    【讨论】:

    • 也试过了。 DatabaseContext 中的 DbSet User {} 语句应处理该问题。是否应该创建一个映射回 datUser 的 DatabaseContext 的属性??
    • 用什么方法试过?我列出了三个选项。
    • 我尝试了 public DbSet datUser { get; 的 DatabaseContext 属性放; } 和 foreach 的控制器语句(this.db.datUser 中的 var 用户)。错误是一样的,只是它指向 datUser 而不是 user??
    • 我最好的猜测是您的 Sqlite 数据库不是您所期望的。您的应用程序是否从与您打开的数据库相同的文件夹中运行?
    • 事实证明这是正确的。 Visual Studio 正在将整个数据目录复制到输出。因此,当连接字符串更改为“Sqlite”时:“Data Source=Data\\HopeApp.db”我开始从数据表中获取数据。解决这个问题后,我发现了另一个问题: users.Append(user);语句不会导致将任何对象添加到列表中。返回时用户始终为空。解决方法是使用 .Add(user) 而不是 Append。不知道为什么,但是控制器现在正在从数据库中返回数据。不确定确保您获得信用的礼仪,但谢谢!
    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2014-05-18
    • 2021-06-22
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多