C# 这是使用实体框架的正确方法吗?
我是一个初学者,我想知道我所做的是否正确,因为我正在查询一个包含350条记录的表,几乎花了一分钟才显示出来!我想我做错了什么。 我就是这样做的: 类内的代码:SPOTC# 这是使用实体框架的正确方法吗?,c#,entity-framework,lifetime,C#,Entity Framework,Lifetime,我是一个初学者,我想知道我所做的是否正确,因为我正在查询一个包含350条记录的表,几乎花了一分钟才显示出来!我想我做错了什么。 我就是这样做的: 类内的代码:SPOT /// <summary> /// Return The City Of this Spot /// </summary> /// <returns>City Of The Spot</returns> public City GetCityO
/// <summary>
/// Return The City Of this Spot
/// </summary>
/// <returns>City Of The Spot</returns>
public City GetCityOfThisSpot()
{
City value;
using (var ctx = new GhanDBEntities())
{
var firstOrDefault = ctx.Spots.FirstOrDefault(s => s.IdSpot == IdSpot);
var city = firstOrDefault.City;
value = city;
}
return value;
}
//
///返回这个地点的城市
///
///现场之城
公共城市GetCityOfthispot()
{
城市价值;
使用(var ctx=new GhanDBEntities())
{
var firstOrDefault=ctx.Spots.firstOrDefault(s=>s.IdSpot==IdSpot);
var city=firstOrDefault.city;
价值=城市;
}
返回值;
}
然后在我的winform中,我用了一些生命的东西:
WINFORM中的代码:
List<City> listOfCities = new List<City>();
foreach (var spot in listOfspot)
{
listOfCities.Add(spot.GetCityOfThisSpot);
}
城市列表=新列表();
foreach(listOfspot中的变量点)
{
添加(spot.getcityofthispot);
}
我想我不应该这样做,因为在每个地方,我都在创造一个环境并破坏它!?您能纠正我吗。
DbContext
是一个轻量级的类,为每个查询创建它并不成问题。但对于WinForms应用程序来说,这只是一种过激的行为——您可以在整个应用程序生命周期中重用相同的上下文实例。注意-对于web应用程序,您通常创建上下文实例,该实例在同一请求期间可用于所有查询
所以,您不需要在WinForms应用程序中处理上下文。您真正需要的是Spot实体中的城市:
public virtual City City { get; set; }
在这种情况下,实体框架将在您需要时提供(请记住-保持上下文不被释放)。此外,如果您希望获得多个景点的城市,则在加载景点时只需执行城市的选择:
var spots = ctx.Spots.Include(s => s.City);
在这种情况下,实体框架将把表和返回点与已经加载的城市连接起来
在这两种情况下,获得景点城市的情况如下:
List<City> listOfCities = listOfspot.Select(s => s.City).ToList();
listOfCities=listOfspot.Select(s=>s.City.ToList();
我还建议您阅读Jon Gallant的文章,在那里您可以找到Diego Vega(实体框架的高级SDE负责人)的响应,该响应指出在常见场景中(如果您不手动打开数据库连接)您不需要在DbContext上调用Dispose。
DbContext
是一个轻量级的类,为每个查询创建它并不成问题。但对于WinForms应用程序来说,这只是一种过激的行为——您可以在整个应用程序生命周期中重用相同的上下文实例。注意-对于web应用程序,您通常创建上下文实例,该实例在同一请求期间可用于所有查询
所以,您不需要在WinForms应用程序中处理上下文。您真正需要的是Spot实体中的城市:
public virtual City City { get; set; }
在这种情况下,实体框架将在您需要时提供(请记住-保持上下文不被释放)。此外,如果您希望获得多个景点的城市,则在加载景点时只需执行城市的选择:
var spots = ctx.Spots.Include(s => s.City);
在这种情况下,实体框架将把表和返回点与已经加载的城市连接起来
在这两种情况下,获得景点城市的情况如下:
List<City> listOfCities = listOfspot.Select(s => s.City).ToList();
listOfCities=listOfspot.Select(s=>s.City.ToList();
我还建议您阅读Jon Gallant的文章,在那里您可以找到Diego Vega(实体框架方面的高级SDE负责人)的回应,其中指出,在常见场景中(如果您不手动打开数据库连接),您不需要在DbContext上调用Dispose。我可以给您一些建议:
null
,我认为最好使用Find、Single或First,或者addnull
(您不会从中获得任何速度优势)var ids = listOfspot.Select(p => p.IdSpot).ToList();
var listOfCities = ctx.Spots.Where(p => ids.Contains(p.IdSpot))
.Select(p => p.City).ToList();
我可以给你一些建议:
null
,我认为最好使用Find、Single或First,或者addnull
(您不会从中获得任何速度优势)var ids = listOfspot.Select(p => p.IdSpot).ToList();
var listOfCities = ctx.Spots.Where(p => ids.Contains(p.IdSpot))
.Select(p => p.City).ToList();
DbContext不是本例中的问题 getcityofthispot() 正在进行db查询,winform中的代码正在运行查询350次
创建一个连接以加快速度。DbContext不是本例中的问题 getcityofthispot() 正在进行db查询,winform中的代码正在运行查询350次 创建一个连接以使其更快