我正在使用带有 .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();
}