【问题标题】:How to create multi-columns "reference" index (join index) in c# model with EF6如何使用 EF6 在 c# 模型中创建多列“引用”索引(连接索引)
【发布时间】:2016-09-21 06:40:30
【问题描述】:

我知道如何在 c# 中创建通用的多列索引,它是数据库中的映射表。 但是我遇到了一个关于多列索引的具体问题,代码如下:

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)

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

【问题讨论】:

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


    【解决方案1】:

    你可以创建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;}
    
        }
    

    【讨论】:

    • 谢谢你启发我,我得到了解决方案
    • 感谢您对我的启发。
    • 没问题! :D
    【解决方案2】:

    感谢https://stackoverflow.com/users/1077309/sampath 对我的启发。 这是解决方案: 正如https://stackoverflow.com/users/1077309/sampath 所说,您只能在原始数据类型上创建索引键

    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 没有在数据库中生成冗余列 Table3No,Table2No。 太完美了。

    【讨论】:

      【解决方案3】:

      我想您的麻烦可能在于使用“导航属性”=引用类型。您应该尝试将外部 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;}
      }
      

      或者你可以改用fluent api

      您可以使用 Fluent API 来定义这样的索引

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

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

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

      【讨论】:

      • 如果我这样做了,就不会有外键引用约束。我知道你的方法可以工作,因为类型是原始类型。我需要外键约束
      猜你喜欢
      • 2021-09-23
      • 2016-01-10
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2023-03-23
      • 2011-04-13
      相关资源
      最近更新 更多