作为主键的一部分时,避免使用Entity Framework外键创建索引

时间:2015-10-06 15:57:16

标签: c# sql-server entity-framework

假设我有三个不同的表格与这些关系:

ER model picture

在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。:我没有直接上传图片的声誉:(

0 个答案:

没有答案