多对多PK的PK首先映射为FK到代码中的多对多表

时间:2012-12-30 03:32:08

标签: c# ef-code-first entity-framework-4.1

这些是我的表:CFFPart,Disp,CFFPartDisp,Expert,CFFpartDispExpert, CFFPartDisp在CFFPart和CF之间有许多关系。 DISP。

ToTable("Discipline", "dbr");
        Property(t => t.Id).HasColumnName("DispID");
        Property(t => t.Text).HasColumnName("DisPName");

        HasMany(t => t.CFFParts).WithMany().Map(m => m.MapLeftKey("DisPID").MapRightKey("CFFPartID").ToTable("CFFPartDisP", "dbr"));

CFFpartDisPExpert在Expert& amp; CFFpartDisP 我如何首先在代码中为此编写映射?

1 个答案:

答案 0 :(得分:1)

您必须将CFFPartDisp公开为模型中的实体类。您不能将其用作CFFPartDisp之间的链接表,并在您的问题中使用Fluent映射。 CFFPartDisp之间的关系不是多对多关系(在严格的EF意义上)。相反,您必须创建两个与CFFPartDisp作为中间实体的一对多关系。然后,您可以将CFFPartDispExpert之间的关系作为第三种关系链接到此中间实体。

CFFPartDisp实体可能如下所示:

public class CFFPartDisp
{
    public int ID { get; set; }

    public int CFFPartID { get; set; }
    public CFFPart CFFPart { get; set; }

    public int DispID { get; set; }
    public Disp Disp { get; set; }

    public ICollection<Expert> Experts { get; set; }
}

CFFPartDisp个实体需要引用CFFPartDisp的集合:

public class CFFPart
{
    public int ID { get; set; }

    public ICollection<CFFPartDisp> CFFPartDisps { get; set; }
}

public class Disp
{
    public int ID { get; set; }

    public ICollection<CFFPartDisp> CFFPartDisps { get; set; }
}

并且Expert还需要CFFPartDisp的集合来建立CFFPartDispExpert之间的多对多关系:

public class Expert
{
    public int ID { get; set; }

    public ICollection<CFFPartDisp> CFFPartDisps { get; set; }
}

使用这些实体可以创建三种关系:

modelBuilder.Entity<CFFPartDisp>()
    .HasRequired(cpd => cpd.CFFPart)
    .WithMany(cp => cp.CFFPartDisps)
    .HasForeignKey(cpd => cpd.CFFPartID);

modelBuilder.Entity<CFFPartDisp>()
    .HasRequired(cpd => cpd.Disp)
    .WithMany(cp => cp.CFFPartDisps)
    .HasForeignKey(cpd => cpd.DispID);

modelBuilder.Entity<CFFPartDisp>()
    .HasMany(cpd => cpd.Experts)
    .WithMany(e => e.CFFPartDisps)
    .Map(m =>
    {
        m.MapLeftKey("CFFPartDispID");
        m.MapRightKey("ExpertID");
        m.ToTable("CFFpartDisPExpert");
    });