嗨我有一个实体如下
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 );
}
}
关系的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
方法,即根据是否存在导航属性表达式或不使用导航属性表达式。
您可以尝试使用这样的DataAnnotation:
public Guid TransactionBatchId { get; set; }
[ForeignKey("TransactionBatchId")]
public SalaryTransactionAudit SalaryTransactionAudit { get; set; }
另见:MSDN