实体框架多个查询多个数据上下文?多个连接

本文关键字:连接 上下文 查询 框架 实体 数据 | 更新日期: 2023-09-27 18:04:22

我是EF的新人,第一次我需要同时执行多个查询,假设我有EF生成的BLL和DAL,我也有一个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,他们将引用两个DALs,当然两个不同的上下文在同一个方法,谁将管理这个?EF 4是否足够聪明,只打开一个连接,让两个(或更多)上下文完成它们的工作,然后关闭连接?下面是我的viewModel看起来像

的一个例子
Silicon sil = new Silicon();
Price = sil.getPrice();
Glass gl = new Glass();
GlassPrice = gl.getPrice();

实体框架多个查询多个数据上下文?多个连接

首先你需要关闭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;
    }
}

您需要管理objectcontext的生命周期,以便正确地初始化和处置它们。有关上下文生命周期管理的优秀资源,请参阅http://blogs.msdn.com/b/alexj/archive/2009/05/07/tip-18-how-to-decide-on-a-lifetime-for-your-objectcontext.aspx