Не удается получить доступ к связанным данным после удаления DataContext в Linq для SQL
Переформулировал мой вопрос, старый текст ниже
Поскольку я все еще надеюсь на ответ, я хотел бы повторить свой вопрос. Изображение У меня есть графический интерфейс с двумя списками, один из которых показывает список всех записей в базе данныхtblOrders
и еще один, который показывает элементы в каждом заказе.
Я могу использовать Linq2sql или EF для получения всех заказов из базы данных, например так:
using (DataClasses1DataContext DataContext = new DataClasses1DataContext())
ListOfOrders = DataContext.tblOrder.ToList();
Я могу отобразить этот порядок в списке илиdatagridview
, Затем при выборе одного из заданий я хочу получить доступ к коллекции объектов из таблицыtblItems
, Я могу сделать это так:
ListOfOrders.First().tblItems.toList();
За исключением того, что я не могу, потому что мне нужноDataContext
который был утилизирован. В каком-то смысле это имеет смысл, поскольку я не могу гарантировать, что с этого заказа не было добавлено ни одного нового элемента, так как я получилListOfOrders. So ideally I would like to check if there has been an addition to a tblOrder.tblItems
коллекцию и только заново получить эту коллекцию с сервера, если требуется.
На заднем плане моя модель немного сложнее: она состоит из заказов, которые состоят из частей, которые состоят из задач. Таким образом, чтобы оценить ход выполнения каждого заказа, мне нужно получить все части, которые принадлежат заказу, и для каждого из них я должен увидеть, сколько задач было выполнено. В базе данных с 200 заданиями, каждая из которых содержит от 1 до 10 частей, это просто замедляет мою программу с точки зрения отзывчивости ...
Может кто-нибудь мне помочь?
Оригинальный вопрос
Я нашел много вопросов, касающихсяDataContext
, но я еще не нашел решение своей проблемы. Если я сделаю следующее:
using (DataClasses1DataContext DataContext = new DataClasses1DataContext())
ListOfOrders = DataContext.tblOrder.ToList();
Это дает мне список объектов вtblOrder
Таблица. Но теперь я хочу сделать это:
DataTable Orders = new DataTable();
Orders.Columns.Add("Order-ID", typeof(int));
Orders.Columns.Add("Order-Name", typeof(string));
Orders.Columns.Add("Order-Items", typeof(string));
dataGridView1.DataSource = Orders;
foreach (tblOrder Order in ListOfOrders)
{
var newRow = Orders.NewRow();
newRow["Order-ID"] = Order.orderID;
newRow["Order-Name"] = Order.orderName;
newRow["Order-Items"] = string.Join(", ", Order.tblItem.Select(item=> item.itemName).ToList());
// System.ObjectDisposedException
(dataGridView1.DataSource as DataTable).Rows.Add(newRow);
}
И я не могу, потому что доступ ко всем сущностям вtblItem
Таблица, связанная с заказами по внешнему ключу, похоже, не сохраняется.
Что работает:
DataClasses1DataContext DataContext = new DataClasses1DataContext();
ListOfOrders = DataContext.tblOrder.ToList();
DataTable Orders = new DataTable();
Orders.Columns.Add("Order-ID", typeof(int));
Orders.Columns.Add("Order-Name", typeof(string));
Orders.Columns.Add("Order-Items", typeof(string));
dataGridView1.DataSource = Orders;
foreach (tblOrder Order in ListOfOrders)
{
var newRow = Orders.NewRow();
newRow["Order-ID"] = Order.orderID;
newRow["Order-Name"] = Order.orderName;
newRow["Order-Items"] = string.Join(", ", Order.tblItem.Select(item=> item.itemName).ToList());
(dataGridView1.DataSource as DataTable).Rows.Add(newRow);
}
DataContext.Dispose();
Но, как я понимаю, это не желательно.
РЕДАКТИРОВАТЬ
Я расширил свой пример в Controller-View-Pattern.
using System.Collections.Generic;
using System.Linq;
namespace TestApplication
{
class Controller
{
private List<tblOrder> _orders;
public IList<tblOrder> Orders
{
get
{
return _orders;
}
}
public Controller()
{
using (var DataContext = new DataClasses1DataContext())
{
_orders = DataContext.tblOrder.ToList();
}
}
}
}
И представление теперь получает Заказы от контроллера:
using System.Data;
using System.Linq;
using System.Windows.Forms;
namespace TestApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Controller controller = new Controller();
DataTable Orders = new DataTable();
Orders.Columns.Add("Order-ID", typeof(int));
Orders.Columns.Add("Order-Name", typeof(string));
Orders.Columns.Add("Order-Items", typeof(string));
dataGridView1.DataSource = Orders;
foreach (tblOrder Order in controller.Orders)
{
var newRow = Orders.NewRow();
newRow["Order-ID"] = Order.orderID;
newRow["Order-Name"] = Order.orderName;
newRow["Order-Items"] = string.Join(", ", Order.tblItem.Select(item=> item.itemName).ToList());
(dataGridView1.DataSource as DataTable).Rows.Add(newRow);
}
}
}
}
К сожалению, проблема остается той же ...