Я использую Matisse DB с привязками .NET для извлечения объектов из базы данных и заполнения сетки данных WPF. База данных создала мне контекст LINQ, который я могу использовать для извлечения объектов из базы данных. Я пытаюсь просто привязать содержимое объекта к сетке WPF, что я могу сделать с ADO.NET/MySQL без проблем. Следующий код показывает мою проблему:
private void displayManagersConsole()
{
//This Works, prints out to console
conn.Open();
LinqExample linq = new LinqExample(conn);
var query = (from m in linq.Managers select m);
foreach (var manager in query)
{
Console.WriteLine(manager.FirstName);
}
conn.Close();
}
private void displayManagersWPF()
{
//This fails
conn.Open();
LinqExample linq = new LinqExample(conn);
peopleGrid.ItemsSource = linq.Managers;
conn.Close();
}
Как видите, у меня есть два метода. Первый метод открывает соединение, получает информацию от объекта, а затем закрывает соединение. Это работает без проблем, и соединение закрывается нормально. Однако, когда я пытаюсь использовать второй метод, он выдает следующее исключение:
MATISSE-E-NOTRANORVERSION, Attempted to access objects without a transaction or version access
Я внимательно изучил документацию и не могу этого объяснить. Странная вещь, если я удаляю conn.Close (); после назначения источника данных моей сетке данных, он работает нормально! Кажется, что даже после того, как источник элементов был назначен, он каким-то образом его кэширует, так что сетке данных необходимо, чтобы соединение было открыто. Я получаю такое поведение только при использовании компонентов wpf, но все консольные запросы работают без проблем. Я также попытался выполнить итерацию в цикле foreach и добавить каждый объект Manager в коллекцию Items сетки данных, только чтобы получить то же исключение.
Я пытался принудительно связать один раз, один раз. Попробовал возиться с транзакциями. Я даже вставил кнопку открытия соединения и закрытия соединения и попытался проследить, что происходит, но просто не могу закрыть соединение, если назначен источник элементов.
Если бы кто-нибудь мог помочь, был бы очень благодарен.
Спасибо,
Mike
РЕДАКТИРОВАТЬ: Кажется, это работает
Рабочая
Решением, которое я использовал, было просто получить нужные столбцы. Поэтому кажется вероятным, что это связано с отложенной загрузкой / активной загрузкой. Документация, однако, не комментирует, как это можно изменить. Спасибо за ввод, я буду использовать это:
private void displayManagersWPF()
{
conn.Open();
conn.StartTransaction();
Example db = new Example(conn);
peopleGrid.ItemsSource = (from m in db.Managers
select new
{
m.FirstName,
m.LastName,
m.Title
}
);
conn.Close();
}