假设我有三个不同的表格与这些关系:
在C#中,我有以下几个类:
[Table("User")]
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Email { get; set; }
// Navigation properties
public virtual OptionalUserData OptionalUserData { get; set; }
public virtual List<FavouriteColor> FavouriteColors { get; set; }
}
[Table("OptionalUserData")]
public class OptionalUserData
{
[Key]
public int UserId { get; set; }
public DateTime Birthday { get; set; }
}
[Table("FavouriteColor")]
public class FavouriteColor
{
[Key, Column(Order = 0)]
public int UserId { get; set; }
[Key, Column(Order = 1)]
public int ColorId { get; set; }
}
我的DbContext如下:
public class SampleContext : DbContext
{
public SampleContext(string connectionString)
: base(connectionString)
{
}
public DbSet<User> Users { get; set; }
public DbSet<OptionalUserData> OptionalUsersData { get; set; }
public DbSet<FavouriteColor> FavouriteColors { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var entityUser = modelBuilder.Entity<User>();
entityUser.HasOptional(s => s.OptionalUserData).WithRequired();
entityUser.HasMany(s => s.FavouriteColors).WithRequired().HasForeignKey(favColors => favColors.UserId);
}
}
它可能很好,但事实并非如此,因为生成的数据库模式由于外键而具有不必要的索引。
在 OptionalUserData 表中,UserId字段上有一个Clustered index(主键),因此在同一个字段上不需要另一个索引(这次是非群集的)。
在 FavouriteColor 表中,UserId和ColorId字段上有一个Composite Clustered索引(主键),因此UserId字段上不需要另一个索引(这次是非群集的)因为我可以使用第一个索引来获得良好的性能。
Management Studio schema Screenshot
所以,任何人都知道如何避免创建这些索引? (到目前为止,我必须在第一次创建它们之后删除它们,但它不是一个非常干净的解决方案。)
P.S。:我没有直接上传图片的声誉:(