Troubleshooting

以下信息公开了 LINQ to SQL 应用程序中可能会遇到的一些问题,并提供建议来避免或减少这些问题的影响。

常见问题解答中解决了其他 问题

不支持的标准查询运算符

LINQ to SQL 不支持所有标准查询运算符方法(例如 ElementAt)。 因此,编译的项目仍会产生运行时错误。 有关详细信息,请参阅 标准查询运算符翻译

内存问题

如果查询涉及内存中集合和 LINQ to SQL Table<TEntity>,则查询可能在内存中执行,具体取决于指定两个集合的顺序。 如果查询必须在内存中执行,则需要检索数据库表中的数据。

此方法效率低下,可能会导致大量内存和处理器使用率。 尝试避免此类多域查询。

文件名和 SQLMetal

若要指定输入文件名,请将名称作为输入文件添加到命令行。 不支持在连接字符串中包含文件名(使用 /conn 选项)。 有关详细信息,请参阅 SqlMetal.exe(代码生成工具)。

类库项目

对象关系设计器在 app.config 项目的文件中创建连接字符串。 在类库项目中,不会用到app.config文件。 LINQ to SQL 使用设计时文件中提供的连接字符串。 更改值 app.config 不会更改应用程序连接到的数据库。

级联删除

LINQ to SQL 不支持或识别级联删除作。 如果要删除具有约束的表中的一行,必须执行以下之一:

  • ON DELETE CASCADE 数据库中的外键约束中设置规则。

  • 使用自己的代码首先删除阻止删除父对象的子对象。

否则,将引发 SqlException 异常。

有关详细信息,请参阅 “如何:从数据库中删除行”。

表达式不可查询

如果收到“表达式 [表达式] 不可查询;是否缺少程序集引用?”错误,请确认以下几点:

  • 应用程序面向 .NET Compact Framework 3.5。

  • 你有引用 System.Core.dllSystem.Data.Linq.dll

  • 你有一个 Imports (Visual Basic) 或 using (C#) 指令,用于 System.LinqSystem.Data.Linq.

DuplicateKeyException

在调试 LINQ to SQL 项目的过程中,可以遍历实体的关系。 这样做会将这些项引入缓存中,LINQ to SQL 会意识到其存在。 如果随后尝试执行 AttachInsertOnSubmit 或生成多个具有相同键的行的类似方法,则会抛出DuplicateKeyException

字符串串联异常

不支持对映射到 [n]text 和其他 [n][var]char 的操作数进行串联。 为将字符串映射到两组不同类型后进行串联而引发异常。 有关详细信息,请参阅 System.String 方法

在 SQL Server 2000 中跳过和处理异常

使用TakeSkip针对 SQL Server 2000 数据库时,必须使用标识成员(IsPrimaryKey)。 查询必须针对单个表(即不是联接),或者是 DistinctExceptIntersectUnion 操作,并且不能包含 Concat 操作。 有关详细信息,请参阅 标准查询操作员翻译中的“SQL Server 2000 支持”部分。

此要求不适用于 SQL Server 2005。

GroupBy InvalidOperationException

当在按boolean表达式分组(如group x by (Phone==@phone))的GroupBy查询中,列值为 null 时,将引发此异常。 因为表达式是一个 boolean,因此,该键被推断为 boolean,而不是 nullableboolean。 当转换后的比较生成 null 时,将尝试向 a nullable赋值booleanboolean,并引发异常。

若要避免这种情况(假设要将 null 视为 false),请使用如下方法:

GroupBy="(Phone != null) && (Phone=@Phone)"

OnCreated() 分部方法

每次调用对象构造函数时,都会调用生成的方法 OnCreated(),包括 LINQ to SQL 调用构造函数来复制原始值的情况。 在自己的分部类中实现OnCreated()方法时,请考虑到此行为。

另请参阅