没有使用 DBContext 从 SQL 数据库返回数据

Posted

技术标签:

【中文标题】没有使用 DBContext 从 SQL 数据库返回数据【英文标题】:No Data is being returned from SQL Database using DBContext 【发布时间】:2021-08-11 01:13:16 【问题描述】:

我正在创建一个使用 Bing 地图和 ASP.Net 绘制路线的系统。我想将路线上停靠点的邮政编码存储在 SQL 数据库中,并使用 MVC 将它们传递给视图。

但是,查询数据库不会返回任何结果,即使已填充数据库。我在代码的各个部分都使用了 Debug.WriteLine,并推断虽然它连接到数据库并查询正确的表,但当我在控制器中初始化 DBContext 时,使用 ToList.Count 显示 0。

我的代码如下:

控制器 - MapController.cs

private StopsDBContext db = new StopsDBContext();

public ActionResult Index()
    

        Debug.WriteLine("***************************************************************************************");
        Debug.WriteLine("--->" + db.Stops.ToList().Count + "<---"); // this shows 0 
        Debug.WriteLine("***************************************************************************************");

        var Stops = from e in db.Stops
                    select e;

        List<Stop> Model = Stops.ToList();

        return View(Model);

    

模型 - Stop.cs

public class Stop

    public int ID  get; set; 
    public string Name  get; set; 
    public string Postcode  get; set; 

    public Stop(int iD, string name, string postcode)
    
        ID = iD;
        Name = name;
        Postcode = postcode;
    

    public Stop() 


public class StopLists

    public IEnumerable<Stop> StopList  get; set; 


public class StopsDBContext : DbContext

    public StopsDBContext()
    
        Database.Log = s => Debug.WriteLine(s); //this shows the sql queries in the console
    
    public DbSet<Stop> Stops  get; set; 

在执行此操作之前,我已将硬编码数据传递到视图中,因此我知道那部分是正确的,并且由于它正在运行查询,它必须连接到数据库,所以我不确定我缺少什么。

提前致谢

编辑:根据 Dai 的建议更新课程

【问题讨论】:

永远不要从控制器动作返回 IEnumerable&lt;T&gt; (因为您的 DbContext 将在视图呈现之前被释放。而在您的情况下,您 正在使用 @ 实现它987654326@,您仍然应该将其输入为List&lt;T&gt;IReadOnlyList&lt;T&gt;,以确保您不会错误地返回“实时”IQueryable&lt;T&gt;。至于为什么列表为空,请使用您的调试器和 SSMS 的事件探查器。事实那 `db.Stops.ToList().Count == 0` 告诉我你的数据库是空的 - 那你为什么期望任何数据被返回?是什么让你认为有任何记录那里? 顺便说一句,实体框架不支持使用主构造函数的不可变实体类型。您需要向Stop 添加一个无参数构造函数。 (另外,我不喜欢 EF 的代码优先方法 - 如果您已经有一个数据库,那么您应该使用 Database first 方法为您生成脚手架实体类,而不是手动编写它们) 感谢您的建议。首先,我现在向Stop 添加了一个空构造函数。其次,我知道数据库有记录这一事实,我在创建它时填充了它,我可以在 SQL Server 对象资源管理器中看到记录。最后,您还需要使用.ToList() 将其填充到List&lt;T&gt; 中吗?抱歉,如果这是一个明显的问题,我对此还是很陌生。 使用您的调试器:在return View(model) 上设置断点并查看db.Database.Connection.ConnectionString 并确保您看起来正确。 【参考方案1】:

我认为你应该这样使用构造函数:

public StopsDBContext() : base("name=Connectionname")

【讨论】:

【参考方案2】:

我现在已经解决了这个错误。感谢所有回复您的建议的人。

原来我的模型和我的表有不同的字段,我没有意识到,所以 DBContext 正在搜索不存在的字段。哎呀。

【讨论】:

以上是关于没有使用 DBContext 从 SQL 数据库返回数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的程序中记录从 DbContext.SaveChanges() 生成的 SQL? [复制]

自动从数据库生成实体模型到当前的DbContext类

使用映射从 edmx 生成 dbcontext 对象

使用 DBContext 将 SQL Server 数据库与时间触发的 Azure 函数连接起来

DotNet Core,没有为此 DbContext 配置数据库提供程序

操作无法完成,因为 DbContext 已使用 MVC 4 处置