实体框架多-多关系手动创建第三个表
本文关键字:三个 创建 框架 关系 实体 | 更新日期: 2023-09-27 18:11:17
我正在为一个CMS类型的应用程序使用EF。我遇到了这个问题,我需要一个M2M(多对多)关系,我希望自己创建第三个表。(老实说,我自己创建所有的表,个人喜好)。
我一直在搜索谷歌,似乎手动创建第三个表是不可能的,EF这样做,无论如何是围绕这个?
例如,下面是一个测试类:
public class Banners
{
public int ID{get;set;}
public string Name{get;set;}
//other columns..
public IList<Page> Pages{get;set;}
}
public class Page
{
public int ID{get;set;}
public string Name{get;set;}
//other columns..
public IList<Banners> Bannerss{get;set;}
}
//MAKE THIS TABLE MANUALLY..?
public class BannersInPages
{
public int BannerId{get;set;}
public int PageId{get;set;}
public int BannerSortOrder{get;set;}
public string Placement {get;set;}
}
从上面的类中,您可以看到一个Banner可以在多个页面中,并且一个页面可以有多个Banner。第三列BannerInPages用于存储关系,另外两列用于指定页面上横幅的排序和位置。
如何使用EF fluent API链接这些数据?这可能吗?
亲切的问候
Asim .
要实现您想要的,您需要在这两个实体和BannersInPages
实体之间创建两个一对多的关系。为此,您需要将集合导航属性的类型更改为BannersInPages
:
public class Banner
{
//other columns..
public IList<BannersInPages> Pages{get;set;}
}
public class Page
{
//other columns..
public IList<BannersInPages> Banners{get;set;}
}
public class BannersInPages
{
public int BannerId{get;set;}
public int PageId{get;set;}
public int BannerSortOrder{get;set;}
public string Placement {get;set;}
// add these navigation properties too if you want (recommended)
public virtual Banner{get;set;}
public virtual Page{get;set}
}
和Fluent Api配置(覆盖OnModelCreating
方法在您的上下文中)将是:
modelBuilder.Entity<BannersInPages>().HasKey(a => new { a.BannerId, a.PageId});
modelBuilder.Entity<BannersInPages>()
.HasRequired(bp=>bp.Banner)
.HasMany(b=>b.Banners)
.HasForeignKey(bp=>bp.BannerId);
modelBuilder.Entity<BannersInPages>()
.HasRequired(bp=>bp.Page)
.HasMany(b=>b.Pages)
.HasForeignKey(bp=>bp.PageId);