2011-07-25 42 views
9

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

当然,我们可以在创建数据库后使用自定义脚本手动完成,但是我们有很多外键指向这个表,如果有更好的,更直的,这将是相当不理想的解决方案在数据库创建期间已经采取了前进的方式。 任何帮助表示赞赏

+2

IMO这就是为什么DB首先被发明。 – Tridus

+0

@Tridus,afaik模型首先是“第一”:)当然,首先模型将是小菜一碟,但Code First具有我发现“更好/更清洁”的优点,尽管它现在看起来还很完美在这个例子这里。到目前为止,我会称之为缺乏定制。 – petho

+0

除非没有,否则它更清洁。 :)对于像这样的数据库首先是非常好的,因为你只需在数据库端做任何你需要做的事情,然后告诉EF“嘿产生一些POCO”。 EF或者你的代码真的没有理由需要知道什么类型的索引正在服务器端使用。 – Tridus

回答

13

没有就没有办法控制SQL代码首先生成 - 它是第一个代码及其当前哲学(一坏实际上)是:你一无所知的数据库,你不要打扰。

更改此行为的唯一方法是编写自定义数据库初始值设定项,使用自定义数据库查询搜索创建的索引,删除该索引并创建一个新的索引。一些参考:

的initilizer会让你的解决方案依赖于具体的数据库服务器产品。

+0

@LadislawMmka。 “消毒器将使您的解决方案取决于具体的数据库服务器产品。” - 如果您为特定产品编写它,则只有这种情况。没有理由为什么这需要限制在特定的提供商。我认为你真正的意思是“这很可能......”。 –

9

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

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

这是在当前版本中实现非聚集索引的最简单方法。它确实需要使用代码迁移。 – jbeanky

+0

EF 6.1中甚至不存在PrimaryKey方法 – Triynko

+0

@triynko您会看到它在为表创建生成的代码第一个迁移类中的CreateTable方法之后被称为链接。该方法位于名称空间System.Data.Entity.Migrations.Builders中的TableBuilder类中。 – Josh