如何使用EF6在c#模型中创建多列“引用”索引(连接索引)

时间:2016-09-21 06:40:30

标签: c# entity-framework entity-framework-6

我知道如何在c#中创建通用的多列索引,这是数据库中的映射表。 但我在Multiple columns索引上遇到一个特定的问题,这里是代码:

public class Table1
{
  [Index("MultipleIndexColumn",1)]
  public Table2 Table2_ID {get; set;}
  [Index("MultipleIndexColumn",2)]
  public Table3 Table3_ID {get; set;}
  [Index("MultipleIndexColumn",3)]
  public DateTime CreateDateTime {get; set;}
}

EF6将生成如下的t-sql:

create index MultipleIndexColumn on Table1(CreateDateTime)这不是预期的sql句子。

这是我的预期: create index MultipleIndexColumn on Table1(Table2_ID,Table3_ID,CreateDateTime)

你们可以帮忙解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

您只能在 index keys上创建Primitive Datatypes 。请尝试如下所示。

public class Table1
{

      [ForeignKey("Table2_ID")]
      public virtual Table2  Table2 { get; set; }

      [Index("MultipleIndexColumn",1)]
      public int Table2_ID { get; set; }

      [ForeignKey("Table3_ID")]
      public virtual Table3  Table3 { get; set; }

      [Index("MultipleIndexColumn",2)]
      public int Table3_ID { get; set; }

      [Index("MultipleIndexColumn",3)]
      public DateTime CreateDateTime {get; set;}

    }

答案 1 :(得分:1)

感谢https://stackoverflow.com/users/1077309/sampath鼓舞我。 这是解决方案: as https://stackoverflow.com/users/1077309/sampath表示只能在Primitive Datatypes

上创建索引键
public class Table1
{

      [ForeignKey("Table2_ID")]
      public virtual Table2  Table2 { get; set; }
      // here is important
      [Index("MultipleIndexColumn",1)]
      public int Table2_ID { get; set; }

      [ForeignKey("Table3_ID")]
      public virtual Table3  Table3 { get; set; }
       // here is important
      [Index("MultipleIndexColumn",2)]
      public int Table3_ID { get; set; }

      [Index("MultipleIndexColumn",3)]
      public DateTime CreateDateTime {get; set;}

    }

作为代码EF6按照我的预期生成索引, 在Table1上创建索引MultipleIndexColumn(Table2_ID,Table3_ID,CreateDateTime)

和EF6 Didn不会在数据库中生成冗余列Table3No,Table2No。 那是完美的。

答案 2 :(得分:0)

我想你的麻烦可能在于使用“导航属性”=引用类型。您应该尝试将外部ID定义为单独的属性,并将它们标记为:

public class Table1
{

  public Table2 Table2Ref {get; set;}

  public Table3 Table3Ref {get; set;}

  [Index("MultipleIndexColumn",3)]
  public DateTime CreateDateTime {get; set;}

  [Index("MultipleIndexColumn",1)]
  public int Table2Id {get; set;}
  [Index("MultipleIndexColumn",2)]
  public int Table3Id {get; set;}
}

或者您可以使用流畅的api

您可以使用Fluent API来定义类似

的索引

https://msdn.microsoft.com/en-us/data/jj591617.aspx?f=255&MSPPError=-2147217396#PropertyIndex

  

有关IndexAttribute中可用设置的完整列表,请参阅   代码优先数据注释的索引部分。这包括   自定义索引名称,创建唯一索引和创建   多列索引。

https://msdn.microsoft.com/en-us/data/jj591583#Index