asp.net core 在两列上创建约束,其中一列是另一个实体

Osa*_*ama 5 .net entity-framework ef-code-first asp.net-core ef-code-first-mapping

我有 2 个类(实体)Exemption 和 Period,我想使用来自豁免的 IdNumber 和来自 Period 的 Id 创建一个唯一索引

     public class Exemption
        {
            [Key]
            public int Id { get; set; }
            [Required]
            public string FirstName { get; set; }
            .
            .
            .
            [Required]
            public string IdNumber { get; set; }
            [Required]
            public Period Period { get; set; }
         }

     public class Period
        {
            [Key]
            public int Id { get; set; }
            .
            .
            .
            [Required]
            public string Year { get; set; }

         }
Run Code Online (Sandbox Code Playgroud)

使用 Fluent API 我在OnModelCreating 中添加了.HasIndex但出现错误

builder.Entity<Exemption>().HasIndex(c => new { c.IdNumber, c.Period }).IsUnique();
Run Code Online (Sandbox Code Playgroud)

添加迁移时出现以下错误

The properties expression 'c => new <>f__AnonymousType5`2(IdNumber = c.IdNumber, Id = c.Period.Id)' is not valid. The expression should represent a property access: 't => t.MyProperty'. When specifying multiple properties use an anonymous type: 't => new {  t.MyProperty1, t.MyProperty2 }'.
Run Code Online (Sandbox Code Playgroud)

我尝试添加c.Period.Id

 builder.Entity<Exemption>()
                    .HasIndex(c => new { c.IdNumber, c.Period.Id }).IsUnique();
Run Code Online (Sandbox Code Playgroud)

得到以下错误

The property 'Period' cannot be added to the entity type 'Exemption' because a navigation property with the same name already exists on entity type 'Exemption'.
Run Code Online (Sandbox Code Playgroud)

我只需要允许每个周期的每个 IdNumber 一个 Exemption.Id 在 EF Core 1.0 中如何做到这一点?

Ste*_*ene 4

您需要显式添加外键:

public class Exemption
{
   [Key]
   public int Id { get; set; }
   [Required]
   public string FirstName { get; set; }
   .
   .
   .
   [Required]
   public string IdNumber { get; set; }
   [Required]
   public int PeriodId { get; set; }
   [ForeignKey("PeriodId")]
   public Period Period { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以索引它:

builder.Entity<Exemption>().HasIndex(c => new { c.IdNumber, c.PeriodId }).IsUnique();
Run Code Online (Sandbox Code Playgroud)

此外,由于您正在为索引使用Fluent api 代码,因此您也可以为所有其他注释使用 Fluent。例如:

builder.Entity<Exemption>()
       .HasKey(c => c.Id)
       .HasIndex(c => new { c.IdNumber, c.PeriodId })
       .IsUnique();

builder.Entity<Exemption>().Property(p => p.FirstName)
       .IsRequired()          
       .HasMaxLength(100);
Run Code Online (Sandbox Code Playgroud)