如何在 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);
}
这样,唯一约束按顺序反对两者的组合,因此,他们在 from
和 to
中放入什么并不重要
在数据库中添加一个 From < To 的检查约束。
除了防止 (1,2),(2,1) 之外,此设计还为您提供了一种简单的方法来查找一对,因为您知道它将存储为 (1,2) 而不是 (2 ,1).
我有一个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);
}
这样,唯一约束按顺序反对两者的组合,因此,他们在 from
和 to
在数据库中添加一个 From < To 的检查约束。
除了防止 (1,2),(2,1) 之外,此设计还为您提供了一种简单的方法来查找一对,因为您知道它将存储为 (1,2) 而不是 (2 ,1).