没有使用 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<T>
(因为您的 DbContext
将在视图呈现之前被释放。而在您的情况下,您 正在使用 @ 实现它987654326@,您仍然应该将其输入为List<T>
或IReadOnlyList<T>
,以确保您不会错误地返回“实时”IQueryable<T>
。至于为什么列表为空,请使用您的调试器和 SSMS 的事件探查器。事实那 `db.Stops.ToList().Count == 0` 告诉我你的数据库是空的 - 那你为什么期望任何数据被返回?是什么让你认为有有任何记录那里?
顺便说一句,实体框架不支持使用主构造函数的不可变实体类型。您需要向Stop
添加一个无参数构造函数。 (另外,我不喜欢 EF 的代码优先方法 - 如果您已经有一个数据库,那么您应该使用 Database first 方法为您生成脚手架实体类,而不是手动编写它们)
感谢您的建议。首先,我现在向Stop
添加了一个空构造函数。其次,我知道数据库有记录这一事实,我在创建它时填充了它,我可以在 SQL Server 对象资源管理器中看到记录。最后,您还需要使用.ToList()
将其填充到List<T>
中吗?抱歉,如果这是一个明显的问题,我对此还是很陌生。
使用您的调试器:在return View(model)
上设置断点并查看db.Database.Connection.ConnectionString
并确保您看起来正确。
【参考方案1】:
我认为你应该这样使用构造函数:
public StopsDBContext() : base("name=Connectionname")
【讨论】:
【参考方案2】:我现在已经解决了这个错误。感谢所有回复您的建议的人。
原来我的模型和我的表有不同的字段,我没有意识到,所以 DBContext 正在搜索不存在的字段。哎呀。
【讨论】:
以上是关于没有使用 DBContext 从 SQL 数据库返回数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的程序中记录从 DbContext.SaveChanges() 生成的 SQL? [复制]
使用 DBContext 将 SQL Server 数据库与时间触发的 Azure 函数连接起来