我有一个模型 DocIdent,它定义了一个人的身份证明文件。它具有 DocIdentTypes 的 FK 和一个值。 (例如:输入:“护照”,值“XXXXX”;输入“社会保险号”,值YYYY;等)
public class DocIdent {
public int Id { get; set; }
[ForeignKey("DocIdentType")]
public int DocIdentTypeId { get; set; } //FK
public string Value { get; set; }
//nav. props
public virtual DocIdentType DocIdentType { get; set; }
}
我在 OnModelCreating() 中定义了一个唯一约束(复合),如下所示:
modelBuilder.Entity<DocIdent>()
.HasIndex(entity => new { entity.DocIdentTypeId, entity.Value }).IsUnique();
因此它只允许 DocIdentType 和 Value 的一种组合。
问题是:有一个 DocIdentType“未记录”(可以说它的 ID 是 5)。显然,对于此 DocIdentType,该值将始终为 null。 (或者,为了避免必须使该字段可以为空,可以说这些情况下的值将始终为“不适用”)。
所以我需要修改约束,以便当且仅当 DocIdentType Id 为 5 时,它必须允许具有重复值。
我希望这个解释是有道理的...
如何做到这一点? (或者不可能吗?)
您可以在索引上使用过滤器,像这样:
modelBuilder.Entity<DocIdent>()
.HasIndex(entity => new { entity.DocIdentTypeId, entity.Value })
.IsUnique()
.HasFilter("[DocIdentTypeId] != 5")
你可以查看这个文档:
UNIQUE 约束允许值为 NULL。
…………
数据库引擎自动创建一个 UNIQUE 索引来强制执行 UNIQUE 约束的唯一性要求。因此,如果尝试插入重复的行,数据库引擎将返回一条错误消息,指出违反了 UNIQUE 约束并且不会将该行添加到表
如果你在数据库中配置了唯一约束,它只会像文档中提到的那样执行,不会忽略特定值(数据库本身不允许你尝试你想要的)。
.IsUnique()
中的参数(true / false)只决定是否添加unique: