EF Core FK Ограничение на альтернативный ключ - PullRequest
1 голос
/ 15 апреля 2019

Привет, у меня есть объект, как показано ниже

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; }
   }

Как настроить (используя свободный API) для ограничения FK на TransactionBatchId что-то вроде ниже

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 ]

5 голосов
/ 15 апреля 2019

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 голосов
/ 15 апреля 2019

Вы можете попробовать использовать DataAnnotation что-то вроде этого:

public Guid TransactionBatchId { get; set; }

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

См. Также: MSDN

...