我有一个WPF应用程序,我在其中使用Entity Framework进行数据访问。我有一个数据服务类,我在其中查询和检索我的数据库中的一些集合
这是我的代码:
class ProductDataService:IProductDataService
{
/// <summary>
/// Context object of Entity Framework model
/// </summary>
private R_MaizeEntities Context { get; set; }
//Constructor
public ProductDataService()
{
Context = new R_MaizeEntities();
}
public IEnumerable<TblProduct> GetAllProducts()
{
var q = from p in Context.TblProducts
where p.IsDel == false
select p;
return q.AsEnumerable();
// This code working fine
//using(var context=new R_MaizeEntities())
//{
// var q = from p in context.TblProducts
// where p.IsDel == false
// select p;
// return new ObservableCollection<TblProduct>(q);
//}
}
}
这是我的观点模型:
public class ProductViewModel : WorkspaceViewModel
{
//Constructor
Public ProductViewModel()
{
LoadProductCollection();
}
private IProductDataService _dataService;
public IProductDataService DataService
{
get
{
if (_dataService == null)
{
if (IsInDesignMode)
{
_dataService = new ProductDataServiceMock();
}
else
{
_dataService = new ProductDataService();
}
}
return _dataService;
}
}
private ObservableCollection<TblProduct> _productRecords;
public ObservableCollection<TblProduct> ProductRecords
{
get { return _productRecords; }
set
{
_productRecords = value;
RaisePropertyChanged("ProductRecords");
}
}
private void LoadProductCollection()
{
var q = DataService.GetAllProducts();
this.ProductRecords = new ObservableCollection<TblProduct>(q);
}
}
我的问题:当我更新现有的product
对象并调用LoadProductCollection
方法来刷新我的ProductRecord
集合(我在视图中绑定到ListView)时,该集合我没有更新我所做的更改,但数据库已更新了更改。
在我的ProductDataService
上我将上下文声明为属性并在构造函数中初始化它,在GetAllProducts
方法上我使用该上下文属性对象来检索我的集合,这不会得到我的更改回来,相反,如果我在Using
语句中使用上下文(在我注释掉的代码中),我得到了更改的集合。
为什么我以前的方法无法检索更改?
答案 0 :(得分:1)
可见的区别在于,在您以前的方法中,每次调用方法时,都使用通过构造函数创建的相同数据上下文对象。
在您注释掉的方法中,每次调用GetAllProductsMethod()时,都会在using语句中创建上下文的新对象。希望它有所帮助。