考虑以下具有1:0..1
关系的实体,其中Foo
可能具有相关的FooBar
,FooBar.Id
既是主键,也是Foo.Id
的外键{1}}:
public class Foo
{
public int Id {get; set;}
public virtual FooBar FooBar {get; set;}
}
public class FooBar
{
public int Id {get; set;}
}
modelBuilder.Entity<Foo>().HasOptional(e => e.FooBar).WithRequired();
这很有效,除了Up()
中生成的迁移代码在FooBar.Id
上包含冗余索引:
CreateTable(
"dbo.FooBar",
c => new
{
Id = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Foo", t => t.Id)
.Index(t => t.Id);
正如您所看到的,对PrimaryKey
的调用将创建一个聚簇索引,并且还有一个来自外键的Index
调用脚手架。确实在数据库中,我看到了两个索引。如果我错了,请纠正我,但在这种情况下永远不会使用非聚集索引,而仅函数只是占用空间。
我认为这种情况正在发生,因为框架中的外键不知道主键。那么,有没有办法让EF实现列已经有来自主键的索引,而不是从外键中绑定一个额外的索引(不需要在迁移的Up()
方法中手动修改代码并删除.Index()
来电?