【发布时间】: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并确保您看起来正确。
标签: c# sql asp.net-mvc bing-maps