【问题标题】:EF Core FK Constraint on Alternate Key备用键上的 EF Core FK 约束
【发布时间】:2019-04-15 06:27:55
【问题描述】:

您好,我有一个实体如下

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 约束配置(使用 fluent 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


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

public Guid TransactionBatchId { get; set; }

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

另请参阅:MSDN

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 2021-09-10
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多