据我所知,我有两种方法可以使用代码优先在asp.net mvc中实现多对多关系。
1- Fluent Api
public class HrPerson
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<HrPersonTitle> HrPersonTitle { get; set; }
}
public class HrPersonTitle
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<HrPerson> HrPerson { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<HrPerson>()
.HasMany(s => s.HrPersonTitle)
.WithMany(c => c.HrPerson)
.Map(t =>
{
t.MapLeftKey("HrPersonId")
.MapRightKey("HrPersonTitleId")
.ToTable("HrMapPersonTitle");
});
}
2 - 自定义映射表
public class HrPerson
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<HrMapPersonTitle> HrMapPersonTitle { get; set; }
}
public class HrPersonTitle
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<HrMapPersonTitle> HrMapPersonTitle { get; set; }
}
public class HrMapPersonTitle
{
public int Id { get; set; }
public int HrPersonId { get; set; }
public int HrPersonTitleId { get; set; }
public virtual HrPerson HrPerson { get; set; }
public virtual HrPersonTitle HrPersonTitle { get; set; }
public string Note { get; set; }
public bool Deleted { get; set; }
}
我的问题:
如果我选择第二种方式,我无法从视图中的HrPerson模型到达HrPersonTitle.Name属性。我怎样才能到达这些房产?
如果我选择第一种方式我可以到达HrPersonTitle.Name但我无法在地图文件中添加更多属性?如何添加更多属性?
问候。
答案 0 :(得分:1)
当你创建一个没有有效负载的M2M (只是外键关系,没有额外的数据)时,EF会折叠关系,这样你就可以直接查询而无需明确地通过连接表。但是,如果您需要有效负载,则EF无法再以这种方式管理关系。
所以,如果你想获得标题,你必须经历HrMapPersonTitle
:
@foreach (var title in Model.HrMapPersonTitle)
{
@title.HrPersonTitle.Name
}
答案 1 :(得分:0)
这两种方法似乎都有点过分。我不知道你的全部意图,但我一直在工作中实现这一点,我使用以下内容:
public class HrPerson
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<HrPersonTitle> HrPersonTitles { get; set; }
}
public class HrPersonTitle
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<HrPerson> HrPersons { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<HrPerson>()
.HasMany(s => s.HrPersonTitles)
.WithMany(c => c.HrPersons);
}
如果您首先使用代码并尝试访问DbContext中的任一映射,则应该延迟加载您的信息,并且每个属性都应该是可访问的。
我确实有一个问题。你确定它应该是多对多,他们真的有多个头衔吗?