EF5使用点名生成SQL Server CE约束

Mik*_*ian 7 sql entity-framework poco sql-server-ce ef-code-first

我正在构建一个.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创建表.数据库按预期执行.dbo.CustomerPK_dbo.Customer_Id

但是,在执行非查询时:

 ALTER TABLE Customer DROP CONSTRAINT PK_dbo.Customer;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  1. 以这样的方式编写DROP语句.字符被解析

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

预先感谢您的帮助!

par*_*tch 9

在[]中包裹那个坏男孩.它告诉解析器里面的所有内容都是关键名称.

ALTER TABLE Customer DROP CONSTRAINT [PK_dbo.Customer];
Run Code Online (Sandbox Code Playgroud)

应该运行正常.我个人只是将每个标识符包装在括号中以避免这个问题.所以我会这样写这个查询.

ALTER TABLE [Customer] DROP CONSTRAINT [PK_dbo.Customer];
Run Code Online (Sandbox Code Playgroud)

我认为它更具可读性,因为您可以立即看到标识符.