如何在 EF Core 中以两种方式制作唯一键?

How to make unique key two ways in EF Core?

我有一个table

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

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

意味着如果 From = 2,并且 To = 1。Table

中不能有 1,2 或 2,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;
}

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

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

然后,将添加索引。

勾选

非常相似,但仅针对一个字段。

编辑

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

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

然后设置两个有序的值:

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

这样,唯一约束按顺序反对两者的组合,因此,他们在 fromto

中放入什么并不重要

在数据库中添加一个 From < To 的检查约束。

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