【问题标题】:Entity Framework Many-Many Relationship Create 3rd Table Manually实体框架多对多关系手动创建第三个表
【发布时间】:2015-09-06 06:37:00
【问题描述】:

我正在将 EF 用于我正在开发的 CMS 类型的应用程序。我遇到了这个问题,我需要一个 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 链接这些数据?这可能吗?

亲切的问候

阿西姆。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      相关资源
      最近更新 更多