C# 在列上创建唯一约束

C# 在列上创建唯一约束,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我有这个型号 public class Record { public int Id {get;set;} public int Client {get;set;} public bool IsActive {get;set;} } 我想为IsActive列创建一个约束 每个客户端只能有一条记录处于活动状态 如何在模型上实现这一点?您需要为您的列创建一个过滤索引ef core have功能,您可以在dbcontext中使用重写OnModelCreating方法对其进行配

我有这个型号

public class Record
{
    public int Id {get;set;}
    public int Client {get;set;}
    public bool IsActive {get;set;}
}
我想为IsActive列创建一个约束

每个客户端只能有一条记录处于活动状态


如何在模型上实现这一点?

您需要为您的列创建一个过滤索引ef core have功能,您可以在dbcontext中使用重写
OnModelCreating
方法对其进行配置

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<Record>(entity =>
   {
       entity.HasIndex(e => e.Client)
        .HasName("Record_Filtered_Index")
        .HasFilter("([IsActive]=(1))");
   });
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity(Entity=>
{
entity.HasIndex(e=>e.Client)
.HasName(“记录过滤索引”)
.HasFilter(([IsActive]=(1))”;
});
}

您可以通过在
Client
IsActive
列上创建唯一索引来实现这一点。基本上,这意味着如果有一个客户机在isActive上为true,它就不能再次插入它。但这对false来说不是也一样吗?因为前面的都是假的。更新完客户机记录后,将其设置为false,以便客户机下次登录时可以开始使用新记录。您需要查看过滤后的索引。EF在这里不能为您提供一种简单的方法,但您可以查看类似于
创建唯一的非聚集索引。。。其中([IsActive]=(1))
我明白了,谢谢,很遗憾,这还不受支持。