【问题标题】:How to make unique key two ways in EF Core?如何在 EF Core 中以两种方式制作唯一键?
【发布时间】:2020-07-18 16:13:54
【问题描述】:

我有一张桌子

class Sample {
  public string From;
  public string To;
}

我想确保 From 和 Two 在整个过程中都是独一无二的

From = 2, To = 1 的含义。表中不能有 1,2 或 2,1 的组合

谢谢

【问题讨论】:

    标签: c# entity-framework ef-fluent-api


    【解决方案1】:

    这并不简单,但您可以做的是创建第三列,它是这两列的串联,并将第三列用作唯一键。

    您应该如何生成第三列,以便 (From,To)=(1,2) 和 (2,1) 都相同?假设第三列名称是Both,您可以使用下面给出的基本算法。

    class Sample {
      public string From;
      public string To;
      public string Both;
    }
    

    算法:

    if(From.ComareTo(To) >= 0) {
       Both = To + From;
    } else {
       Both = From + To;
    }
    

    【讨论】:

      【解决方案2】:

      您将需要使用模型定义,在您需要添加的上下文中

      modelBuilder
          .Entity<Sample>()
          .HasIndex(u => new { u.From, u.To })
              .IsUnique();
      

      然后,将添加索引。

      查看Entity Framework Core add unique constraint code-first

      非常相似,但仅适用于一个文件。

      编辑

      如果您需要唯一的一对,则将其与另一个答案结合,在您的表中添加一个字段并按顺序组合,

      class Sample {
        public string From;
        public string To;
        public string Both;
      }
      

      然后设置两个ord​​ered的值:

      var list = new List<string>
      {
          sample.From, sample.To
      }
          .OrderBy(x => x)
          .ToList();
      sample.Both = string.Join(":", list);
      }
      

      通过这种方式,唯一约束是针对两者的组合,因此,它们在fromto 中放置的内容并不重要

      【讨论】:

      • 错误答案!它不保留对的唯一性。
      【解决方案3】:

      在数据库中添加一个检查约束From

      除了防止 (1,2),(2,1) 之外,此设计还为您提供了一种查找配对的简单方法,因为您知道它将存储为 (1,2) 而不是 (2,1) )。

      【讨论】:

      • 知道我的键是字符串,所以假设我的 From = 'Apple',To = 'Banana'
      • 您的解决方案帮助了谢谢
      • 假设您的表中没有记录。如果您收到 From='Banana', To='Apple',您的应用程序的预期行为是什么?根据你对问题的描述,我的理解是,你应该插入它,如果下次你得到 From='Apple',To='Banana',你不会让它插入。但是,如果你使用这个约束,它只会让 From='Apple' 和 To='Banana'。
      猜你喜欢
      • 1970-01-01
      • 2021-11-17
      • 2021-03-11
      • 1970-01-01
      • 2014-05-03
      • 2020-05-14
      • 2023-03-31
      • 1970-01-01
      • 2020-10-20
      相关资源
      最近更新 更多