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

4

我有一个名为 DocIdent 的模型,用于定义人员的身份文件。它具有到 DocIdentTypes 的外键和一个值。(例如:类型:“护照”,值“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时,它必须允许具有重复值。

我希望这个解释有意义...

怎么做?(或者不可能吗?)

2个回答

2

您可以在索引上使用过滤器,例如:

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

1
你可以查看这个文档

UNIQUE 约束允许 NULL 值。

..........

数据库引擎会自动创建一个唯一索引来强制执行唯一约束的要求。因此,如果尝试插入重复行,则数据库引擎将返回一个错误消息,指出违反了唯一约束,并且不会将该行添加到表中。
如果在数据库中配置了唯一约束,则它将按照文档所述执行,不会忽略特定值(数据库本身不允许您尝试您想要的操作)。 .IsUnique() 中的参数(true/false)仅确定是否向其添加唯一性:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接