【发布时间】: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
我有一张桌子
class Sample {
public string From;
public string To;
}
我想确保 From 和 Two 在整个过程中都是独一无二的
From = 2, To = 1 的含义。表中不能有 1,2 或 2,1 的组合
谢谢
【问题讨论】:
标签: c# entity-framework ef-fluent-api
这并不简单,但您可以做的是创建第三列,它是这两列的串联,并将第三列用作唯一键。
您应该如何生成第三列,以便 (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();
然后,将添加索引。
查看Entity Framework Core add unique constraint code-first
非常相似,但仅适用于一个文件。
编辑
如果您需要唯一的一对,则将其与另一个答案结合,在您的表中添加一个字段并按顺序组合,
class Sample {
public string From;
public string To;
public string Both;
}
然后设置两个ordered的值:
var list = new List<string>
{
sample.From, sample.To
}
.OrderBy(x => x)
.ToList();
sample.Both = string.Join(":", list);
}
通过这种方式,唯一约束是针对两者的组合,因此,它们在from 和to 中放置的内容并不重要
【讨论】:
在数据库中添加一个检查约束From
除了防止 (1,2),(2,1) 之外,此设计还为您提供了一种查找配对的简单方法,因为您知道它将存储为 (1,2) 而不是 (2,1) )。
【讨论】: