这会抛出一个错误,指出该查询包含对在不同数据上下文中定义的项的引用。当我尝试在底部分配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上执行的。
答案 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; }
}