.NET 6(核心)EF - 条件唯一约束?

问题描述 投票:0回答:2

我有一个模型 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 时,它必须允许具有重复值。

我希望这个解释是有道理的...

如何做到这一点? (或者不可能吗?)

asp.net-core entity-framework-core unique-constraint
2个回答
1
投票

您可以在索引上使用过滤器,像这样:

 modelBuilder.Entity<DocIdent>()
            .HasIndex(entity => new { entity.DocIdentTypeId, entity.Value })
            .IsUnique()
            .HasFilter("[DocIdentTypeId] != 5")

1
投票

你可以查看这个文档

UNIQUE 约束允许值为 NULL。

…………

数据库引擎自动创建一个 UNIQUE 索引来强制执行 UNIQUE 约束的唯一性要求。因此,如果尝试插入重复的行,数据库引擎将返回一条错误消息,指出违反了 UNIQUE 约束并且不会将该行添加到表

如果你在数据库中配置了唯一约束,它只会像文档中提到的那样执行,不会忽略特定值(数据库本身不允许你尝试你想要的)。

.IsUnique()
中的参数(true / false)只决定是否添加unique:

© www.soinside.com 2019 - 2024. All rights reserved.