sql - EF5 使用名称中的点生成 SQL Server CE 约束

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

我正在构建一个 .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.Customer带有主键约束 PK_dbo.Customer_Id .数据库按预期执行。

但是,在执行非查询时:

 ALTER TABLE Customer DROP CONSTRAINT PK_dbo.Customer;

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

There was an error parsing the query.
[ Token line number = 1, Token line offset = 57, Token in error = . ]



当然,使用辅助 DataContext没有外键的对象生成没有约束的数据库,后面再添加即可;但是,这需要维护两个 DataContext对象,希望不要忘记保持更新。因此,我正在寻找两种解决方案之一:
  • 以这样的方式编写 DROP 语句,使得 .字符被解析
  • 防止 EF5 使用 .约束和索引名称中的字符

  • 预先感谢您的帮助!

    最佳答案

    将那个坏男孩包裹在 [] 中。它告诉解析器里面的所有东西都是键名。

    ALTER TABLE Customer DROP CONSTRAINT [PK_dbo.Customer];
    

    应该运行良好。
    就我个人而言,我只是将每个标识符都用括号括起来以避免这个确切的问题。所以我会像这样写这个查询。
    ALTER TABLE [Customer] DROP CONSTRAINT [PK_dbo.Customer];
    

    我认为这样更易读,因为您可以立即看到标识符。

    关于sql - EF5 使用名称中的点生成 SQL Server CE 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18140219/

    相关文章:

    python - Pandas 在两个数据帧之间执行 SQL 减法

    python - Django:按不同列的最新过滤

    sql - 如何获取星期六的日期(或任何其他工作日的日期)- SQL Server

    azure - 部署到 Azure Web App 后未创建代码优先表

    mysql - 需要更新包含数百万行的 MySQL 表

    c# - Entity Framework 在数据库中添加了额外的字段。并添加复合键的两个成员

    c# - EF LINQ ToList 非常慢

    c# - 使用 Entity Framework 仅选择某些列然后保存回数据库

    entity-framework - 具有 Entity Framework 代码优先和 Oracle 提供程序的 boolean 类型

    C# - EF 6 抽象导航属性