【问题标题】:EF5 generates SQL Server CE constraints with dot in nameEF5 生成名称中带有点的 SQL Server CE 约束
【发布时间】:2013-08-11 00:05:25
【问题描述】:

我正在构建一个 .NET 断开连接的客户端-服务器应用程序,该应用程序使用 Entity Framework 5 (EF5) 从 POCO 生成 SQL Server CE 4.0 数据库。该应用程序允许用户将数据从网络 SQL Server 批量复制到客户端的 SQL Server CE 数据库中。由于 EF5 创建的约束和索引,这非常(非常)慢。暂时删除约束和索引会将 30 分钟的等待时间减少到 1 分钟或更短。

在开始大容量复制之前,应用程序执行查询以从 SQL Server CE 表中删除约束和索引。但是,这些命令会失败,因为 EF5 创建的约束名称包括表架构名称、点和表名称。由于解析问题,约束名称中的点导致 drop 命令失败。

例如,POCO Customer 使用主键约束 PK_dbo.Customer_Id 创建表 dbo.Customer。数据库按预期执行。

但是,在执行非查询时:

 ALTER TABLE Customer DROP CONSTRAINT PK_dbo.Customer;

SQL Server Compact ADO.NET 数据提供程序返回错误:

解析查询时出错。
[ 令牌行号 = 1,令牌行偏移量 = 57,错误令牌 = . ]

当然,使用没有外键的辅助DataContext对象生成没有约束的数据库,然后再添加它们就可以了;但是,这需要维护两个 DataContext 对象,并希望不要忘记保持更新。因此,我正在寻找以下两种解决方案之一:

  1. 编写 DROP 语句,使 .字符被解析

  2. 阻止 EF5 使用 .约束和索引名称中的字符

提前感谢您的帮助!

【问题讨论】:

  • 您是否尝试过我的 SqlCeBulkCopy 库来解决性能问题?

标签: sql entity-framework ef-code-first sql-server-ce poco


【解决方案1】:

用 [] 把那个坏男孩包起来。它告诉解析器里面的所有东西都是键名。

ALTER TABLE Customer DROP CONSTRAINT [PK_dbo.Customer];

应该运行良好。 就我个人而言,我只是将每个标识符括在括号中以避免这个确切的问题。所以我会这样写这个查询。

ALTER TABLE [Customer] DROP CONSTRAINT [PK_dbo.Customer];

我认为这种方式更具可读性,因为您可以立即看到标识符。

【讨论】:

  • 哦,那很糟糕。我不敢相信我错过了。可悲的是,我是那种一直让每个人都使用括号的人。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2017-05-26
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多