EF Core FK 对备用键的约束
EF Core FK Constraint on Alternate Key
您好,我有一个实体如下
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 上配置(使用流畅的 API)FK 约束,如下所示
public class SalaryTransactionConfiguration : IEntityTypeConfiguration<SalaryTransaction>
{
public void Configure(EntityTypeBuilder<SalaryTransaction> builder)
{
builder.ToTable("SalaryTransaction");
builder.HasKey(e => e.SalaryTransactionId);
builder.HasForeignKey(e => e.TransactionBatchId );
}
}
您可以尝试像这样使用 DataAnnotation:
public Guid TransactionBatchId { get; set; }
[ForeignKey("TransactionBatchId")]
public SalaryTransactionAudit SalaryTransactionAudit { get; set; }
另请参阅:MSDN
关系的外键/主键通过关系构建器配置 HasForeignKey
/ HasPrincipalKey
流畅 API.
如果您至少向相关实体之一添加导航 属性 就更好了。但是对于当前的模型,假设关系是一对多的,它可能是这样的:
里面SalaryTransactionConfiguration
class
builder
.HasOne<SalaryTransactionAudit>()
.WithMany()
.HasForeignKey(e => e.TransactionBatchId)
.HasPrincipalKey(e => e.TransactionBatchId);
或在SalaryTransactionAuditConfiguration
class
内
builder
.HasMany<SalaryTransaction>()
.WithOne()
.HasForeignKey(e => e.TransactionBatchId)
.HasPrincipalKey(e => e.TransactionBatchId);
关系总是有两端的,所以当使用实体类型配置时 classes,将配置放在其中一个,但不要同时放在两个(以避免为一个和相同的关系配置冗余或冲突)。还要确保正确使用 Has
/ With
方法,即有或没有导航 属性 表达式取决于它是否存在。
您好,我有一个实体如下
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 上配置(使用流畅的 API)FK 约束,如下所示
public class SalaryTransactionConfiguration : IEntityTypeConfiguration<SalaryTransaction>
{
public void Configure(EntityTypeBuilder<SalaryTransaction> builder)
{
builder.ToTable("SalaryTransaction");
builder.HasKey(e => e.SalaryTransactionId);
builder.HasForeignKey(e => e.TransactionBatchId );
}
}
您可以尝试像这样使用 DataAnnotation:
public Guid TransactionBatchId { get; set; }
[ForeignKey("TransactionBatchId")]
public SalaryTransactionAudit SalaryTransactionAudit { get; set; }
另请参阅:MSDN
关系的外键/主键通过关系构建器配置 HasForeignKey
/ HasPrincipalKey
流畅 API.
如果您至少向相关实体之一添加导航 属性 就更好了。但是对于当前的模型,假设关系是一对多的,它可能是这样的:
里面SalaryTransactionConfiguration
class
builder
.HasOne<SalaryTransactionAudit>()
.WithMany()
.HasForeignKey(e => e.TransactionBatchId)
.HasPrincipalKey(e => e.TransactionBatchId);
或在SalaryTransactionAuditConfiguration
class
builder
.HasMany<SalaryTransaction>()
.WithOne()
.HasForeignKey(e => e.TransactionBatchId)
.HasPrincipalKey(e => e.TransactionBatchId);
关系总是有两端的,所以当使用实体类型配置时 classes,将配置放在其中一个,但不要同时放在两个(以避免为一个和相同的关系配置冗余或冲突)。还要确保正确使用 Has
/ With
方法,即有或没有导航 属性 表达式取决于它是否存在。