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

时间:2015-09-05 21:42:08

标签: c# entity-framework

我正在使用EF进行我正在处理的CMS类型应用程序。我遇到过这个问题,我需要一个M2M(多对多)关系,我希望自己创建第三个表。 (老实说,我自己创建所有表格,个人喜好)。

我一直在搜索Google,似乎手动创建第3个表是不可能的,而EF也是这样做的,无论如何都有吗?

例如,这是一个测试类。

https://www.googleapis.com/youtube/v3/channels?part=contentDetails&key=[KEY FROM GOOGLE API CONSOLE]&id=[CHANNEL ID]

从上面的课程中,您可以看到一个横幅可以在很多页面中,一个页面可以有很多横幅。使用存储关系的第3列BannerInPages以及另外两列来指定页面上横幅的排序和放置。

如何使用EF fluent API链接此数据?这可能吗?

亲切的问候

阿西。

1 个答案:

答案 0 :(得分:2)

要实现您的目标,您需要在这两个实体和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);