替代密钥上的EF核心FK约束

问题描述 投票:1回答:2

嗨我有一个实体如下

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 Constraint配置(使用流畅的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 );

        }
} 
c# asp.net-core entity-framework-core ef-fluent-api
2个回答
5
投票

关系的Foregn /主键是通过关系构建器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方法,即根据是否存在导航属性表达式或不使用导航属性表达式。


0
投票

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

public Guid TransactionBatchId { get; set; }

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

另见:MSDN

© www.soinside.com 2019 - 2024. All rights reserved.