WPF DataGrid не может закрыть соединение с БД (Матисс) - PullRequest
0 голосов
/ 07 января 2012

Я использую 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();
    }

1 Ответ

1 голос
/ 07 января 2012

var linq = от i в dc.Менеджеры выбирают i.FirstName;

peopleGrid.ItemsSource = linq.ToList ();

dc.Connection.Close ();

...