迭代LINQ-to-SQL Queryable时出现InvalidOperationException

时间:2015-12-13 03:01:32

标签: c# sqlite unity3d linq-to-sql mono

我使用LINQ to SQL将数据从SQLite数据库映射到C#对象。当我在Visual Studio项目中运行它时,一切都很完美,但出于某种原因,我无法让它在Unity中运行。

非常简化的代码如下:

foreach

但是在DbCommand的头部抛出了一个InvalidOperationException,说“由于对象的当前状态,”操作无效“

  • 我知道映射有效,因为它在Visual Studio中有效。
  • 我知道数据库连接有效,因为它在使用“普通”System.Data.dll时会起作用。
  • 我对包含的DLL仍然有点不确定,但是我再次测试它与VS中的那些(与“内置”的相反)并且它有效。在我的Assets文件夹中,我有来自Mono安装的System.Data.Linq.dllMono.Data.Sqlitesqlite3.dll,以及来自SQLite网站的sqlite3.defInvalidOperationException: Operation is not valid due to the current state of the object System.Linq.Enumerable.Single[MemberInfo] (IEnumerable`1 source, System.Func`2 predicate, Fallback fallback) System.Linq.Enumerable.Single[MemberInfo] (IEnumerable`1 source) DbLinq.Data.Linq.Mapping.AttributedMetaAssociation..ctor (System.Reflection.MemberInfo member, System.Data.Linq.Mapping. AssociationAttribute attribute, System.Data.Linq.Mapping.MetaDataMember metaDataMember) DbLinq.Data.Linq.Mapping.AttributedMetaType+<GetAssociations>c__Iterator5.MoveNext () System.Collections.Generic.List`1[System.Data.Linq.Mapping.MetaAssociation].AddEnumerable (IEnumerable`1 enumerable) (at / Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:128) System.Collections.Generic.List`1[System.Data.Linq.Mapping.MetaAssociation]..ctor (IEnumerable`1 collection) (at /Users/ builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:65) System.Linq.Enumerable.ToList[MetaAssociation] (IEnumerable`1 source) DbLinq.Data.Linq.Mapping.AttributedMetaType.get_Associations () System.Data.Linq.DataContext.SetEntitySetsQueries (System.Object entity) System.Data.Linq.DataContext._GetOrRegisterEntity (System.Object entity) System.Data.Linq.DataContext.Register (System.Object entity) DbLinq.Data.Linq.Sugar.Implementation.QueryRunner.Select[Output] (DbLinq.Data.Linq.Sugar.SelectQuery selectQuery) DbLinq.Data.Linq.Implementation.QueryProvider`1[Bitcoin.Output].GetEnumerator () System.Data.Linq.Table`1[Bitcoin.Output].GetEnumerator () DAO.SQLiteDAO.test (System.String filePath) (at Assets/DAO/SQLiteDAO.cs:103) DAO.SQLiteDAO..ctor (System.String filePath) (at Assets/DAO/SQLiteDAO.cs:25) SphereSpawner.Start () (at Assets/SphereSpawner.cs:30)

例外情况如下:

Single()

我在这里阅读的所有内容看似相似,但我从未在任何事情上积极使用UITableViewController,所以不可能;而且我很确定列表也不是空的。它至少应该不是。

请帮助,我在这里失去理智:P

1 个答案:

答案 0 :(得分:0)

所以是的,显然映射是问题所在。看起来Mono.Data.Sqlite需要比System.Data.SQLite更明确的属性,而我在后者中完美运行的解决方案并不适用于前者。

我发现:

  • 所有Association必须指定Name
  • IsForeignKey=true必须在适用时设置。
  • 显然,Association中用作外键的ID无法存储在公共Column成员中;相反,它们必须使用Storage="privateMember"包装在属性中。最后,为了确定,我将每个Column映射实现为属性。