0

我正在使用带有 .NET 绑定的 Matisse DB 从数据库中获取对象并填充 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(); 将 itemssource 分配给我的数据网格后,它工作正常!似乎即使在分配了 itemssource 之后,它也以某种方式对其进行了缓存,因此数据网格需要打开连接。我只有在使用 wpf 组件时才会出现这种行为,但所有控制台查询都可以正常工作。我还尝试在 foreach 循环中进行迭代,并将每个 Manager 对象添加到数据网格的 Items 集合中,只是为了得到相同的异常。

我曾尝试以一种方式强制绑定,一次。试过搞乱交易。我什至放了一个连接打开和连接关闭按钮,并试图跟踪正在发生的事情,但如果分配了 itemssource,我根本无法关闭连接。

如果有人可以提供帮助,将不胜感激。谢谢,迈克

编辑:这似乎有效 我使用的解决方案 是获取我想要的列。因此,它似乎与延迟加载/急切加载有关。然而,该文档似乎没有评论如何修改它。感谢您的输入,我将使用这个:

    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();
    }
4

1 回答 1

1

var linq = 从 dc.Managers 中的 i 选择 i.FirstName;

peopleGrid.ItemsSource = linq.ToList();

dc.Connection.Close();

于 2012-01-07T16:44:51.120 回答