我使用带有.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();将itemsource分配给我的数据网格后,它工作得很好!似乎即使在分配了itemssoource之后,它也会以某种方式缓存它,因此数据网格需要打开连接。我只有在使用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();
}
var linq=来自dc中的i。经理选择i.FirstName;
peopleGrid.ItemsSource=linq。ToList();
dc.Connection.Close();