實體框架核心多對多不插入

entity-framework entity-framework-core

我正在使用EF7並且有一個需要多對多關係的場景。

我有一個ParticipantSIR實體和ParticipantAssessmentReport實體。它們之間有一個鏈接表ParticipantSIRAssessmentReport。

public class ParticipantSIR
{
    public int ParticipantSIRID { get; set; }

    public virtual ICollection<ParticipantSIRAssessmentReport> ParticipantSIRAssessmentReport { get; set; }
    public virtual Participant Participant { get; set; }
}

public class ParticipantAssessmentReport
{
    public int ParticipantAssessmentReportID { get; set; }

    public virtual ICollection<ParticipantSIRAssessmentReport> ParticipantSIRAssessmentReport { get; set; }

}

public partial class ParticipantSIRAssessmentReport
{
    public int ParticipantSIRID { get; set; }
    public int ParticipantAssessmentReportID { get; set; }

    public virtual ParticipantAssessmentReport ParticipantAssessmentReport { get; set; }
    public virtual ParticipantSIR ParticipantSIR { get; set; }
}



modelBuilder.Entity<ParticipantSIRAssessmentReport>(entity =>
        {
            entity.HasKey(e => new { e.ParticipantSIRID, e.ParticipantAssessmentReportID });

            entity.HasOne(d => d.ParticipantAssessmentReport).WithMany(p => p.ParticipantSIRAssessmentReport).HasForeignKey(d => d.ParticipantAssessmentReportID).OnDelete(DeleteBehavior.Restrict);

            entity.HasOne(d => d.ParticipantSIR).WithMany(p => p.ParticipantSIRAssessmentReport).HasForeignKey(d => d.ParticipantSIRID).OnDelete(DeleteBehavior.Restrict);
        });

這似乎是需要使用EF核心(包括第三個實體)設置的方式。我從中得到了一些信息。 http://ef.readthedocs.io/en/latest/modeling/relationships.html#many-to-many當我插入數據時,會填充2個外部實體,但不會填充鏈接表。

由於ParticipantSIR和ParticipantAssessmentReport之間沒有導航屬性,因此我不確定如何添加鏈接數據。

  _db.ParticipantAssessmentReport.Add(participantAssessmentReport);
            foreach (var sir in participantSirs)
            {
                _db.ParticipantSIR.Add(sir);
            }
            _db.SaveChanges();

一般承認的答案

假設我們正在談論EF Core 1.0rc1,看起來你已經正確地創建了你的模型(除了虛擬關鍵字沒有做任何事情,因為懶惰加載還沒有實現)。

從1.0rc1開始,由於多對多尚未實現,因此您需要做一些額外的工作。有關經典博客Post,Tag,PostTag示例代碼,請參閱https://github.com/aspnet/EntityFramework/issues/1368#issuecomment-180066124

在您的情況下,您需要明確地添加到ParticipantSIRAssessmentReport,如下所示:

    var participantSIRAssessmentReport = new ParticipantSIRAssessmentReport {ParticipantSIR = participantSIR, ParticipantAssessmentReport = participantAssessmentReport };  
    _db.ParticipantSIRAssessmentReport.Add(participantSIRAssessmentReport);  
    _db.SaveChanges();

熱門答案

要在EF中映射多對多關係,您需要將以下內容添加到DbContextOnModelCreating()方法中:

modelBuilder.Entity<ParticipantSIR>()
    .HasMany(e => e.ParticipantSIRAssessmentReport)
    .WithMany(e => e.ParticipantSIR)
    .Map(e => e.ToTable("ParticipantSIRAssessmentReport") //Name of the linking table
           .MapLeftKey("ParticipantSIRId") //Name of the Left column
           .MapRightKey("ParticipantSIRAssessmentReportId")); //Name of the right column

從這裡開始,將使用每個類中的集合來處理關係。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因