该查询包含对在不同数据上下文中定义的项的引用?

时间:2013-08-13 16:09:22

标签: c# linq-to-sql

这会抛出一个错误,指出该查询包含对在不同数据上下文中定义的项的引用。当我尝试在底部分配catName时。

this.CustomSettings = (
                                    from xx in DBContext.ProductCustomizationMasters
                                    where xx.ProductID == this._ProductID
                                    select new ProductCustomization()
                                    {
                                        ProductID = (int)xx.ProductID,
                                        CategoryID = (int)xx.CustomCategoryID,
                                        CustomID = xx.CustomID,
                                        CustomizationType = (CategoryType)xx.CustomType,
                                        DefaultFreeCount = (short)xx.DefaultFreeCount,
                                        IsDefaultLimit = (bool)xx.IsDefault,
                                        HasItems = ((xx.DefaultFreeCount == 0) ? (false) : (true)),
                                        CatName= (from yy in DBContext.CustomCategoryTbls where yy.CatID == xx.CustomCategoryID select yy.CatName).FirstOrDefault()
                                    }
                                    ).ToList();

我喜欢这样的数据文字

private libDBDataContext _DB = null;
public libDBDataContext DBContext { get { return (_DB == null) ? new libDBDataContext() : _DB; } set { _DB = value; } }

它是如何表示它有两个不同的datacontext,而事情是在同一个datacontext上执行的。

1 个答案:

答案 0 :(得分:1)

每次访问DBContext媒体资源时,您都会创建新的libDBDataContext,因为您从未将其分配给_DB

尝试将代码更改为此

private libDBDataContext _DB = null;
public libDBDataContext DBContext 
{ 
    get 
    {
        if (_DB == null)
        {
            _DB = new libDBDataContext();
        }
        return _DB; 
    }

    set { _DB = value; }
}

这不是线程安全的,但它可以帮助您解决当前的问题。

修改

正如@Servy指出的那样,使用Lazy进行了更清晰且线程安全的实现。

private Lazy<libDBDataContext> _DB = new Lazy<libDBDataContext>(
    () => new libDBDataContext()
);

public libDBDataContext DBContext
{
    get { return _DB.Value; }
}