【问题标题】:Entity framework 5 many to many when an entity is using composite key当实体使用复合键时,实体框架 5 多对多
【发布时间】:2013-06-14 08:26:11
【问题描述】:

当我想首先使用代码映射多对多关系时,我在使用 EF 5 时遇到了一些问题。 这是我的场景:

public class SegFunction
{
    public virtual string Idaplication {get;set;}

    public virtual string Idfunction {get;set;}

    public virtual List<SegRole> Roles { get; set; }

}

public class SegRole
{
    public virtual int Idrole { get; set; }

    public virtual List<SegFunction> Functions { get; set; }

}

这是我的地图:

private void MapSegRole()
    {
        this.modelBuilder.Entity<SegRole>()
        .Map(entity =>
        {
            entity.ToTable("seg_roles");
        });
        this.modelBuilder.Entity<SegRole>()
            .Property(t => t.Idrole).HasColumnName("id_role");
        this.modelBuilder.Entity<SegRole>()
             .HasKey(c => c.Idrole);


        modelBuilder.Entity<SegRol>()
       .HasMany(i => i.Functions)
       .WithMany(c => c.Roles)
       .Map(
        m =>
        {
            mc.ToTable("seg_role_function");
            m.MapRightKey("id_role");
            m.MapLeftKey("id_aplication");
            m.MapLeftKey("id_function");
        });
    }

private void MapSegFunction()
    {

        this.modelBuilder.Entity<Segfunction>()
        .Map(entity =>
        {
            entity.ToTable("seg_functions");
        });
        this.modelBuilder.Entity<Segfunction>()
            .Property(t => t.Idfunction).HasColumnName("id_function");
        this.modelBuilder.Entity<Segfunction>()
            .Property(t => t.Idaplication).HasColumnName("id_aplication");
        this.modelBuilder.Entity<Segfuncion>()
            .HasKey( d => new { d.Idaplication, d.Idfunction});

        this.modelBuilder.Entity<Segfunction>()
           .HasMany(t => t.Roles)
           .WithMany(r => r.Functions)
            .Map(mc =>
            {
                mc.ToTable("seg_role_function");
                mc.MapLeftKey("id_role");
                mc.MapRightKey("id_aplication");
                mc.MapRightKey("id_function");
            });





    }

我有三张桌子 Seg_Role, Seg_Function, Seg_role_function 其中seg_function有复合主键(id_aplication, id_function),seg_role_function有复合主键(id_role, id_aplication, id_function)

当我尝试从上下文中获取时出现以下错误:

指定的关联外键列“id_role”无效。指定的列数必须与主键列数匹配。

【问题讨论】:

    标签: many-to-many entity-framework-5 fluent composite-key


    【解决方案1】:

    MapLeftKeyMapRightKey 有一个 params string[] keyColumnNames 参数,因此对于复合键,您将多个参数传递给这些方法,而不是调用它们两次:

    modelBuilder.Entity<SegRol>()
       .HasMany(i => i.Functions)
       .WithMany(c => c.Roles)
       .Map(m =>
        {
            mc.ToTable("seg_role_function");
            m.MapLeftKey("id_role");
            m.MapRightKey("id_aplication", "id_function");
        });
    

    【讨论】:

    • @DiegoGomez:你能用我上面的完全映射试试吗?仅在MapSegRole 中并去掉MapSegFunction 中的第二个多对多映射,是多余的。在您的映射中...Left......Right... 是错误的,它必须是相反的方式。
    • 是的,它有效!非常感谢,这个问题快把我逼疯了!
    • 您的意思是 m.ToTable 而不是 mc.ToTable 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多