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

我有一个跟踪记录附件的课程。 每个记录可以有多个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)因为每个Record可能有多个false值。

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

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

编辑:查看这样的答案: 比特列的唯一约束只允许1个真(1)值看起来这可能直接用SQL创建约束,但是它不会反映在我的模型中。

您可以使用HasFilter fluent API指定索引filter。

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

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

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

有关更多信息,请参阅关系数据库建模 – 索引文档主题。