Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# EntityFramework多个查询多个数据上下文?多重连接?_C#_Wpf_Entity Framework - Fatal编程技术网

C# EntityFramework多个查询多个数据上下文?多重连接?

C# EntityFramework多个查询多个数据上下文?多重连接?,c#,wpf,entity-framework,C#,Wpf,Entity Framework,我是EF的新手,第一次我需要同时执行多个查询,假设我的BLL和DAL由EF生成,我还有一个viewModel,在BLL上我引用DAL并检索如下数据: public Decimal getPrice() { Decimal x = 0; siliconContext = new DAL.Entities(); var result = from d in siliconContext.SILICONs

我是EF的新手,第一次我需要同时执行多个查询,假设我的BLL和DAL由EF生成,我还有一个viewModel,在BLL上我引用DAL并检索如下数据:

public Decimal getPrice()
    {
        Decimal x = 0;
        siliconContext = new DAL.Entities();
        var result = from d in siliconContext.SILICONs
                     select d.MIN_PRICE;
        foreach (Decimal d in result)
        {
            x = d;
        }
        return x;
    }
很好,在viewModel上,我只使用以下两行代码:

Silicon sil = new Silicon();
Price = sil.getPrice();
我假设上下文将处理连接,打开连接,做一些事情,然后关闭它,但现在我处于一种情况,在我的ViewModel中,我将引用两个BLL,它们将引用两个DAL,当然,在同一方法中引用两个不同的上下文,谁来管理它?EF4是否足够聪明,可以只打开一个连接,让两个或多个上下文完成工作,然后关闭连接?下面是我的viewModel的外观示例

Silicon sil = new Silicon();
Price = sil.getPrice();
Glass gl = new Glass();
GlassPrice = gl.getPrice();

您需要管理objectcontext的生存期,以便对其进行适当的初始化和处理。有关上下文生存期管理的优秀资源,请参阅

首先,您需要关闭DataContext的连接

public Decimal getPrice()
{
    Decimal x = 0;
    using (DAL.Entities siliconContext = new DAL.Entities())
    {
        var result = from d in siliconContext.SILICONs
                     select d.MIN_PRICE;
        foreach (Decimal d in result)
        {
            x = d;
        }
        return x;
    }
}
其次,如果要从两个表中获取数据,请执行以下操作

public Decimal getPrice()
{
    Decimal x = 0; 
    using (DAL.Entities siliconContext = new DAL.Entities())
    {
        var result = from d in siliconContext.SILICONs
                     select d.MIN_PRICE;

        var result2 = from d in seliconContext.GLASEs
                      select d.MIN_PRICE;

        //You can then work with results from table GLASE!

        foreach (Decimal d in result)
        {
            x = d;
        }
        return x;
    }
}

谢谢你的链接,稍后再看谢谢你的回复,我只有一个数据库,在我的示例中,我试图从两个表中检索,Silicon和Glass,我理解你的第一个代码片段,但是第二个没有回答我的问题,你是说对于一个数据库和多表,我仍然使用一个上下文吗,那我怎么做呢?为了完成我的最后一段代码?同意,我现在理解了一些新的东西,但是请看我文章中的最后一段代码,我有两个不同的类(Silicon和Glass),每个类都会引用它的DAL类,每个DAL类都会自己连接到数据库,因为每个类都会执行它自己的getPrice()方法,这意味着两个不同的连接,连接会一个接一个地打开和关闭,这不好,我想这是一个设计问题,但我不确定,我希望你明白我的意思。是的,你有点担心PreFace总是打开和关闭与数据库的连接。我个人更喜欢这种方法,也就是说,对于特定的工作单元,连接的生命周期只是“活的”。我不会太在意演出。此外,Ragzitsu还展示了一个非常好的链接,可以帮助您解释大多数问题。希望这有帮助。