【问题标题】:Join table in many-to-many with 3-column primary key使用 3 列主键以多对多方式连接表
【发布时间】:2016-11-04 21:11:12
【问题描述】:

我想使用代码优先和流利的 API 基于 3 个实体创建 3 个表。我使用的是实体框架版本 6。连接表需要一个 3 列主键和附加列。

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

连接表 { PatentId, TreatmentId, 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 ...
}

【问题讨论】:

    标签: c# entity-framework ef-code-first many-to-many


    【解决方案1】:

    您不能将此建模为隐藏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 =&gt; new { x.PatientId, x.TreatmentId, x.TreatmentDate }) 主要是你要找的。​​p>

    【讨论】:

      【解决方案2】:

      我只是在stackoverflow中搜索它

      不可能创建多对多关系 自定义连接表。在多对多关系中,EF 管理 内部连接表并隐藏。这是一个没有实体类的表 在你的模型中。要使用这样的连接表,需要额外的 您必须创建的属性实际上是两个一对多 关系 检查这个many to many with extra column

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 2022-08-24
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多