具有3列主键的多对多连接表

本文关键字:连接 3列 具有 | 更新日期: 2023-09-27 18:16:28

我想使用代码优先和流畅的API创建基于3个实体的3个表。我正在使用实体框架版本6。连接表需要一个3列的主键和其他列。

我的问题:我如何使用代码优先与c# Fluent API来创建/映射PatientTreatment表的3列主键?谢谢你。

连接表{PatentId, treatmentd, TreatmentDate}的3列主键的详细信息。PatentIdTreatmentId的值从其他2个实体(表)中获取,而TreatmentDate的值则手动输入(例如c#代码或T-SQL脚本,如调用getdate()函数)。

三个实体的详细信息:

public class Patient {
  public long PatentId {get; set;} // database created using Identity
  ...
}
public class Treatment {
  public long TreatmentId {get; set;}  // database created using Identity
  ... 
}

和连接表(实体)

public class PatientTreatment
{
   public long PatentId {get; set;} // part of the primary key from the Patient entity
   public long TreatmentId {get; set;} // part of the primary key from the Treatment entity
   public DateTime TreatmentDate {get; set;} // part of the primary key but its value is from C# code or from T-SQL script, not from other entity (table)
   // other fields ...
}

具有3列主键的多对多连接表

您不能将其建模为隐藏PatientTreatment类的多对多关联,这通常被称为实体框架映射中的多对多。

但是您不打算这样做,从您显示的显式PatientTreatment类中可以明显看出。所以这只是一个正确建模的问题。

DbContext子类的OnModelCreating覆盖中,像这样设置映射:

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<PatientTreatment>()
      .HasKey(x => new { x.PatientId, x.TreatmentId, x.TreatmentDate });
    mb.Entity<Patient>().HasMany(p => p.PatientTreatments)
      .WithRequired().HasForeignKey(x => x.PatientId);
    mb.Entity<Treatment>().HasMany(t => t.PatientTreatments)
      .WithRequired().HasForeignKey(x => x.TreatmentId);
    base.OnModelCreating(mb);
}

我想这行HasKey(x => new { x.PatientId, x.TreatmentId, x.TreatmentDate })是你主要寻找的。

我只是在stackoverflow中搜索

不可能与a创建多对多关系自定义连接表。在多对多关系中,EF管理连接表内部和隐藏。它是一个没有Entity类的表在你的模型中。来处理这样的连接表您必须创建的属性实际上是两个一对多的关系用额外的列

检查这个多对多