实体框架流畅地映射多对五

时间:2015-03-09 15:26:30

标签: c# entity-framework mapping many-to-many fluent

我尝试映射此模型时遇到问题:

public class Discipline
{
    public int Id {get;set;}
    public string Name{get;set;}
    public virtual ICollection<DisciplineRequirement> Requirements {get;set;}
}

public class DisciplineRequirement
{
    public int DisciplineId {get;set;}
    public int RequiredDiscipline {get;set;}
    public virtual Discipline Discipline {get;set;}
    public virtual Discipline RequiredDiscipline {get;set;}
}

映射代码:

public class DisciplineMap : EntityTypeConfiguration<Discipline>
{
    public DisciplineMap()
    {
        ToTable("Discipline");

        HasKey(p => p.Id);

        HasMany(p => p.Requirements)
            .WithRequired(p => p.Discipline)
            .HasForeignKey(p => p.DisciplineId);

        HasMany(p => p.Requirements)
            .WithRequired(p => p.RequiredDiscipline)
            .HasForeignKey(p => p.RequiredDisciplineId);
    }
}

public class DisciplineRequirementMap : EntityTypeConfiguration<DisciplineRequeriment>
{
    public DisciplineRequirementMap()
    {
        ToTable("DisciplineRequirement");

        HasKey(p => new
        {
            p.DisciplineId,
            p.RequiredDisciplineId
        });

        HasRequired(p => p.Discipline)
            .WithMany(p => p.Requirements)
            .HasForeignKey(p => p.DisciplineId);

        HasRequired(p => p.RequiredDiscipline)
            .WithMany(p => p.Requirements)
            .HasForeignKey(p => p.RequiredDisciplineId);

    }
}

我有这个错误:

在模型生成期间检测到一个或多个验证错误: 要求:FromRole:NavigationProperty“要求”无效。在AssociationType'Discipline_Requirements'中输入FromRole'Descipline_Requirements_Target'的'DisciplineRequeriment'必须与声明此NavigationProperty的类型'Discipline'完全匹配。

有谁能在这里给我一个亮点?

1 个答案:

答案 0 :(得分:2)

imho,你必须有两个导航属性(或者至少只有一个你不能用两个FK配置它)

public class Discipline
{
    public int Id {get;set;}
    public string Name{get;set;}
    public virtual ICollection<DisciplineRequirement> Requirements {get;set;}
    public virtual ICollection<DisciplineRequirement> RequiredBy {get;set;}
}

public class DisciplineRequirement
{
    public int DisciplineId {get;set;}
    public int RequiredDisciplineId {get;set;}
    public virtual Discipline Discipline {get;set;}
    public virtual Discipline RequiredDiscipline {get;set;}
}

public class DisciplineMap : EntityTypeConfiguration<Discipline>
{
    public DisciplineMap()
    {
        ToTable("Discipline");

        HasKey(p => p.Id);
    }
}

public class DisciplineRequirementMap : EntityTypeConfiguration<DisciplineRequeriment>
{
    public DisciplineRequirementMap()
    {
        ToTable("DisciplineRequirement");

        HasKey(p => new
        {
            p.DisciplineId,
            p.RequiredDisciplineId
        });

        HasRequired(p => p.Discipline)
            .WithMany(p => p.RequiredBy)
            .HasForeignKey(p => p.DisciplineId);

        HasRequired(p => p.RequiredDiscipline)
            .WithMany(p => p.Requirements)
            .HasForeignKey(p => p.RequiredDisciplineId);

    }
}

应该足够了。