EF Core FK对备用键的约束

Ala*_*n B 1 c# entity-framework-core ef-fluent-api asp.net-core

嗨,我有如下实体

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; }
}
Run Code Online (Sandbox Code Playgroud)

上面的实体在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);
        }
 }
Run Code Online (Sandbox Code Playgroud)

我也有这个实体

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; }
   }
Run Code Online (Sandbox Code Playgroud)

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

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

        }
} 
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

关系的前/主键是通过关系构建器HasForeignKey/ HasPrincipalKey流利的API 配置的。

如果您至少将导航属性添加到相关实体之一,那就太好了。但是使用当前模型,并假设关系是一对多的,则可能是这样的:

内部SalaryTransactionConfiguration

builder
    .HasOne<SalaryTransactionAudit>()
    .WithMany()
    .HasForeignKey(e => e.TransactionBatchId)
    .HasPrincipalKey(e => e.TransactionBatchId);
Run Code Online (Sandbox Code Playgroud)

或内SalaryTransactionAuditConfiguration

builder
    .HasMany<SalaryTransaction>()
    .WithOne()
    .HasForeignKey(e => e.TransactionBatchId)
    .HasPrincipalKey(e => e.TransactionBatchId);
Run Code Online (Sandbox Code Playgroud)

关系始终具有两端,因此,在使用实体类型配置类时,请将配置放在其中一个中,但不要同时放在两者中(以避免一个或相同关系的冗余或冲突配置)。另外,请确保正确使用Has/ With方法,即根据是否存在导航属性表达式进行选择。