仅在EF Core中为“true”创建唯一约束

时间:2018-04-27 19:53:21

标签: c# sql-server entity-framework-core

我有一个用于跟踪记录附件的课程。每个记录可以有多个RecordAttachments,但是要求每个记录只能有一个标记为IsPrimary的RecordAttachment。

public class RecordAttachment
{
    public int Id { get; set; }
    public int RecordId { get; set; }
    public string Details { get; set; }
    public bool IsPrimary { get; set; }

    public Record Record { get; set; }
}

我不能只使用.HasIndex(e => new { e.RecordId, e.IsPrimary }).IsUnique(true),因为每个记录可能有多个false值。

基本上我需要RecordIdIsPrimary == true上的唯一约束,尽管这不起作用:

entity.HasIndex(e => new { e.RecordId, IsPrimary = (e.IsPrimary == true) }).IsUnique(true)

编辑: 看看这样的答案:Unique Constraint for Bit Column Allowing Only 1 True (1) Value看来这可能直接用SQL创建约束,但是它不会反映在我的模型中。

1 个答案:

答案 0 :(得分:8)

您可以使用HasFilter流畅的API指定索引过滤器。

不幸的是,它不是数据库不可知的,因此您必须使用目标数据库SQL语法和实际的表列名称。

对于Sql Server,它将是这样的:

.HasIndex(e => new { e.RecordId, e.IsPrimary })
.IsUnique()
.HasFilter("[IsPrimary] = 1");

有关详细信息,请参阅Relational Database Modeling - Indexes文档主题。