【问题标题】:Multi-column indexes in Entity Framework 6Entity Framework 6 中的多列索引
【发布时间】:2021-04-17 05:05:06
【问题描述】:

我正在使用 Entity Framework 6.0 开发旧系统,并且有一项新要求是允许用户在已删除的记录上重新使用之前使用过的代码。为此,我添加了一个可为空的 DeletedDate 列和一个结合了代码和删除日期的唯一索引。

为了实现这一点,我在 DataContext 上的 OnModelCreating 方法中添加了以下代码。

modelBuilder.Entity<MyEntity>().HasIndex(e => new {e.Code, e.DeletedDate}).IsUnique();

这很好。但后来我们有一个类似的要求,用户希望重用名称和代码,而不一定要一起使用。所以我想我可以这样做:

 modelBuilder.Entity<MyEntity>().HasIndex(e => new {e.Name, e.DeletedDate}).IsUnique();
 modelBuilder.Entity<MyEntity>().HasIndex(e => new {e.Code, e.DeletedDate}).IsUnique();

这编译、运行并且没有抛出任何错误,但是当我检查数据库上的结果索引时,第一个总是从其定义中丢失 DeletedDate 列,仅在 Name 上创建一个唯一索引。我可以在 SQL Server 中手动添加 DeletedDate 列,但 EF 根本不会为我这样做。

这是一个错误还是我不能这样做的充分理由?也许更重要的是,有没有办法我可以先在 EF 代码中实现这一点?

我们使用的是 SQL Server 2019。

【问题讨论】:

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


    【解决方案1】:

    我解决这个问题的方法是在每个属性上使用 Index 属性。

    [Index("IX_Name_DeletedDate", 1, IsUnique = true)]
    public string Name { get; set;}
    
    [Index("IX_Code_DeletedDate", 1, IsUnique = true)]
    public string Code { get; set;}
    
    [Index("IX_Code_DeletedDate", 2, IsUnique = true)]
    [Index("IX_UniqueIdentity_DeletedDate", 2, IsUnique = true)]
    public DateTime? DeletedDate { get; set; }
    

    无法使用流畅的语法执行此操作似乎是 EF 6.0 中的一个错误

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 2014-03-15
      • 2014-02-07
      • 2014-01-04
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多