我有一个用于跟踪记录附件的课程。每个记录可以有多个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
值。
基本上我需要RecordId
和IsPrimary == 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创建约束,但是它不会反映在我的模型中。
答案 0 :(得分:8)
您可以使用HasFilter
流畅的API指定索引过滤器。
不幸的是,它不是数据库不可知的,因此您必须使用目标数据库SQL语法和实际的表列名称。
对于Sql Server,它将是这样的:
.HasIndex(e => new { e.RecordId, e.IsPrimary })
.IsUnique()
.HasFilter("[IsPrimary] = 1");
有关详细信息,请参阅Relational Database Modeling - Indexes文档主题。