实体框架多-多关系手动创建第三个表

本文关键字:三个 创建 框架 关系 实体 | 更新日期: 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);