EF Core FK 对备用键的约束

EF Core FK Constraint on Alternate Key

您好,我有一个实体如下

public class SalaryTransactionAudit
{
      public long SalaryTransactionAuditId { get; set; }
      public Guid TransactionBatchId { get; set; }
      public DateTime UploadedDate { get; set; }
      public string UploadedBy { get; set; }
      public long SalaryTransactionStatusId { get; set; }
}

上述实体在 SalaryTransactionAuditId 上有主键,在 TransactionBatchId 上有备用键,如下所示

public class SalaryTransactionAuditConfiguration : IEntityTypeConfiguration<SalaryTransactionAudit>
{
        public void Configure(EntityTypeBuilder<SalaryTransactionAudit> builder)
        {
            builder.ToTable("SalaryTransactionAudit");
            builder.HasKey(e => e.SalaryTransactionAuditId);
            builder.HasAlternateKey(e => e.TransactionBatchId);
        }
 }

我也有这个实体

public class SalaryTransaction
 {
        public long SalaryTransactionId { get; set; }
        public Guid TransactionBatchId { get; set; }
        public long EmployeeId { get; set; }
        public int AnnualSalary { get; set; }
        public int SuperRate { get; set; }
        public int PaymentPeriodYear { get; set; }
        public int PaymentPeriodMonth { get; set; }

        public Employee Employee { get; set; }
   }

如何在 TransactionBatchId 上配置(使用流畅的 API)FK 约束,如下所示

public class SalaryTransactionConfiguration : IEntityTypeConfiguration<SalaryTransaction>
{
        public void Configure(EntityTypeBuilder<SalaryTransaction> builder)
        {
            builder.ToTable("SalaryTransaction");
            builder.HasKey(e => e.SalaryTransactionId);
            builder.HasForeignKey(e => e.TransactionBatchId );

        }
} 

您可以尝试像这样使用 DataAnnotation:

public Guid TransactionBatchId { get; set; }

[ForeignKey("TransactionBatchId")]  
public SalaryTransactionAudit SalaryTransactionAudit { get; set; }

另请参阅:MSDN

关系的外键/主键通过关系构建器配置 HasForeignKey / HasPrincipalKey 流畅 API.

如果您至少向相关实体之一添加导航 属性 就更好了。但是对于当前的模型,假设关系是一对多的,它可能是这样的:

里面SalaryTransactionConfigurationclass

builder
    .HasOne<SalaryTransactionAudit>()
    .WithMany()
    .HasForeignKey(e => e.TransactionBatchId)
    .HasPrincipalKey(e => e.TransactionBatchId);

或在SalaryTransactionAuditConfigurationclass

builder
    .HasMany<SalaryTransaction>()
    .WithOne()
    .HasForeignKey(e => e.TransactionBatchId)
    .HasPrincipalKey(e => e.TransactionBatchId);

关系总是有两端的,所以当使用实体类型配置时 classes,将配置放在其中一个,但不要同时放在两个(以避免为一个和相同的关系配置冗余或冲突)。还要确保正确使用 Has / With 方法,即有或没有导航 属性 表达式取决于它是否存在。