如何在代码优先的实体框架 fluent API 中指定多列 UNIQUE 约束

Mat*_*hew 5 c# entity-framework ef-fluent-api

假设我有以下实体:

public class Calendar{
    public int ID{get;set;}
    public ICollection<Day> Days { get; set; }
}
public class Day{
    public int ID{get;set;}
    public DateTime Date{get;set;}
    public int CalendarID{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

这是与CalendarID作为外键的一对多关系。问题是我还想确保每个日期在每个日历中只存在一次。也就是说,没有两天同时具有相同Date和相同的CalendarID。在原始 SQL 中,我可以通过以下方式执行此操作:

ALTER TABLE Days
ADD CONSTRAINT UN_Day UNIQUE ([Date],CalendarID);
Run Code Online (Sandbox Code Playgroud)

但是,实体框架在自动创建表时不会知道我想要这个。如何在 fluent API 中指定它?

Cal*_*alC 5

请参阅在一个或多个属性上配置索引

在您的映射类中,假设它EntityTypeConfiguration<Day>从那时起扩展,您将需要添加using System.Data.Entity.Infrastructure.Annotations;并执行以下操作:

this.Property(x => x.Date)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName,
                 new IndexAnnotation(new IndexAttribute("UN_Day", 0) { IsUnique = true }));

this.Property(x => x.CalendarID)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName,
                 new IndexAnnotation(new IndexAttribute("UN_Day", 1) { IsUnique = true }));
Run Code Online (Sandbox Code Playgroud)