Die*_*mez 0 many-to-many fluent composite-key entity-framework-5
当我想首先使用代码映射多对多关系时,我对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; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的地图:
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");
});
}
Run Code Online (Sandbox Code Playgroud)
和
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");
});
}
Run Code Online (Sandbox Code Playgroud)
我有三个表Seg_Role,Seg_Function,Seg_role_function其中seg_function有复合主键(id_aplication,id_function)和seg_role_function有一个复合键(id_role,id_aplication,id_function)
当我尝试从上下文中获取时,我收到以下错误:
指定的关联外键列'id_role'无效.指定的列数必须与主键列的数量匹配.
MapLeftKey并且MapRightKey有一个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");
});
Run Code Online (Sandbox Code Playgroud)