使用EntityFramework.Extended进行简单批量删除会引发语法错误

时间:2015-05-26 12:12:25

标签: c# mysql entity-framework

我正在使用Entity Framework 6.1.1和MySQL 5.6.24,我想批量删除大量记录。 我正在使用EntityFramework.Extended来提高效果。

然而,我的第一个非常简单的更新查询已经失败:

DbContext.Tickets.Where(t => t.EventID == targetEvent.EventID).Delete();

这会在mscolib中抛出一个AggregateException,内部异常是一个MySQLException:

[MySqlException (0x80004005): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[youreal_TicketPlatform].[Tickets]
FROM [youreal_TicketPlatform].[Tickets] AS j' at line 1]
   MySql.Data.MySqlClient.MySqlStream.ReadPacket() +501
   MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) +444
   MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) +136
   MySql.Data.MySqlClient.MySqlDataReader.NextResult() +1254
   MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +2626
   MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() +137
   EntityFramework.Batch.<InternalDelete>d__0`1.MoveNext() +1350

有没有人遇到同样的错误?查看正在执行的实际查询的最简单方法是什么?在DbContext.Database.Log上添加侦听器不会显示查询。

基本上我想要批量删除大量数据而不必先检索它们。

2 个答案:

答案 0 :(得分:3)

我遇到了这个问题,并找到了解决方案。只需将Locator的默认BatchRunner从SqlServerBatchRunner更改为MySqlBatchRunner,它就可以与MySQL一起使用。

EntityFramework.Locator.Current.Register<EntityFramework.Batch.IBatchRunner>(
            () => new EntityFramework.Batch.MySqlBatchRunner());

存储库中的相关代码: https://github.com/loresoft/EntityFramework.Extended/blob/master/Source/EntityFramework.Extended/Locator.cs

相关问题: https://github.com/loresoft/EntityFramework.Extended/issues/163

答案 1 :(得分:1)

我确定这是因为你使用的是mysql。我知道EF的Bulk工具都不适用于mysql。如果你查看source / Database for Extended,它只包含SqlServer和SqlCompact。

您可以自己编写Sql并通过Entityframework执行该操作。