Tôi đang viết một số mã để truy cập cơ sở dữ liệu bằng EntityFrameWork. Mã này là:Tại sao tôi cần một ToList() để tránh các lỗi ngữ cảnh được xử lý?
public IEnumerable<Rows> GetRows(int id)
{
using (var context = new ApplicationDbContext())
{
var repository = new EntityFrameWorkRepository<int, RowEntity>(context);
//need a ToList() here to prevent disposed dbcontext errors
return repository.GetRowsFromDb(id).ToList();
}
}
GetRowsFromDb() sử dụng LINQ để truy vấn cơ sở dữ liệu và lọc kết quả bằng id. Tôi đã viết phương thức trên mà không có cuộc gọi ToList(), nhưng khi tôi cố truy cập các đối tượng trong IEnumerable đã được trả lại, tôi sẽ nhận được một ngoại lệ về dbcontext đã được xử lý. Tôi không hiểu làm thế nào mã trên sửa chữa mọi thứ, mặc dù nó sau đó làm việc. Tôi giả sử ToList() là sâu sao chép các đối tượng và rằng điều này có lẽ cung cấp sự tách biệt cần thiết từ bối cảnh/cơ sở dữ liệu, nhưng chắc chắn các đối tượng ban đầu nên có thể sử dụng?
'IEnumerables' rất lười, vì vậy ngữ cảnh sẽ được xử lý trước khi bất kỳ kết quả nào được tìm nạp trong phương thức gọi. 'ToList' khiến mọi thứ trở nên háo hức. – Lee
Tìm kiếm 'LINQ deffered execution' – MarcinJuraszek
Liên quan ngẫu nhiên: http://stackoverflow.com/questions/27491762/creating-a-plan-repository-but-using-keyword-in-constructor-body/27491794#27491794 – BradleyDotNET