EF Core FK对备用键的约束

时间:2019-04-15 06:27:56

标签: c# asp.net-core entity-framework-core ef-fluent-api

嗨,我有一个如下实体

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 上针对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 );

        }
} 

2 个答案:

答案 0 :(得分:5)

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

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

SalaryTransactionConfiguration类内部

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

或在SalaryTransactionAuditConfiguration类中

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

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

答案 1 :(得分:0)

您可以尝试使用DataAnnotation这样的内容:

public Guid TransactionBatchId { get; set; }

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

另请参阅:MSDN