【问题标题】:EF CodeFirst create non-clustered primary key indexEF Code First 创建非聚集主键索引
【发布时间】:2013-04-18 02:23:58
【问题描述】:

我正在使用 EF 4.1 CodeFirst 创建我的数据库。似乎 EF 正在使用聚集索引创建所有主键,这在一种情况下(可能更多情况下)对我们来说并不是最优的。 有没有办法告诉 EF 用主键作为非聚集索引生成这张表?

当然,我们可以在创建数据库后使用自定义脚本手动完成,但是我们有很多指向该表的外键,如果有更好、更直接的解决方案,那将是一个相当不理想的解决方案在数据库创建期间已经做同样的事情的方法。 任何帮助表示赞赏

【问题讨论】:

  • IMO 这就是 DB First 被发明的原因。
  • @Tridus,afaik Model First 是“第一” :) 当然,如果使用 Model First,这将是小菜一碟,但 Code First 具有我认为“更好/更清洁”的优势,尽管现在是远非完美,正如在此示例中所见。到目前为止,我认为它缺乏提供的定制。
  • 它更干净,除非它不是。 :) 对于像 DB First 这样的东西非常好,因为您只需在数据库端做任何您需要做的事情,然后告诉 EF“嘿,从中生成一些 POCO”。确实没有理由 EF 或您的代码需要知道服务器端正在使用什么类型的索引。
  • 你可以在这里为这个功能投票:connect.microsoft.com/VisualStudio/feedback/details/624575/…

标签: entity-framework entity-framework-4.1 code-first


【解决方案1】:

不,没有办法控制 SQL 代码首先生成 - 它是代码优先,它当前的理念(实际上是糟糕的)是:您对数据库一无所知,也不必费心。

改变这种行为的唯一方法是编写自定义数据库初始化程序,使用自定义数据库查询来搜索创建的索引,删除该索引并创建一个新索引。一些参考资料:

初始化程序将使您的解决方案依赖于具体的数据库服务器产品。

【讨论】:

  • @LadislawMmka。 “初始化程序将使您的解决方案依赖于具体的数据库服务器产品。” - 仅当您为特定产品编写时才会出现这种情况。没有理由将其限制为特定的提供商。我认为你真正的意思是“这很可能......”。
【解决方案2】:

是的,有一种方法可以指定不创建聚集索引。如果您使用代码迁移,则会生成一个 *.cs 文件以填充您的数据库。如果需要使用聚簇索引创建表,您可以在此文件中指定除主键之外的每个表。

  .PrimaryKey(t => t.MID, null, true)

【讨论】:

  • 这是当前版本中实现非聚集索引最简单的方法。它确实需要使用代码迁移。
  • EF 6.1 中甚至不存在 PrimaryKey 方法
  • @triynko 您将看到它在为创建表而生成的代码优先迁移类中的 CreateTable 方法之后被链接调用。该方法位于命名空间 System.Data.Entity.Migrations.Builders 中的 TableBuilder 类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多