Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是使用实体框架的正确方法吗?_C#_Entity Framework_Lifetime - Fatal编程技术网

C# 这是使用实体框架的正确方法吗?

C# 这是使用实体框架的正确方法吗?,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

我是一个初学者,我想知道我所做的是否正确,因为我正在查询一个包含350条记录的表,几乎花了一分钟才显示出来!我想我做错了什么。 我就是这样做的:

类内的代码:SPOT

    /// <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。

我可以给您一些建议:

  • 您使用的是FirstOrDefault,但没有检查
    null
    ,我认为最好使用Find、Single或First,或者add
    null
    (您不会从中获得任何速度优势)

  • 您很可能会从批处理请求中获得速度优势:

    var ids = listOfspot.Select(p => p.IdSpot).ToList();
    var listOfCities = ctx.Spots.Where(p => ids.Contains(p.IdSpot))
                          .Select(p => p.City).ToList();
    

  • 我可以给你一些建议:

  • 您使用的是FirstOrDefault,但没有检查
    null
    ,我认为最好使用Find、Single或First,或者add
    null
    (您不会从中获得任何速度优势)

  • 您很可能会从批处理请求中获得速度优势:

    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次

    创建一个连接以使其更快