如何在EF中配置一对多关系

时间:2015-05-12 21:11:30

标签: c# entity-framework one-to-many model-binding junction-table

我有以下型号

public class PageConfig : Base
{
    // Properties Etc..

    public ICollection<Image> ScrollerImages { get; set; }
}

我的方法是使用联结表{PageConfigID,ImageID}进行绑定。

在我的模型活页夹中,我尝试了以下内容..

modelBuilder.Entity<PageConfig>()
    .HasMany(x => x.ScrollerImages)
    .WithMany()
    .Map(x =>
    {
        x.ToTable("junc_PageConfigScrollerImages");
        x.MapLeftKey("PageConfigID");
        x.MapRightKey("ImageID");
    });

这会导致图像的空集合。

如何将这些图像绑定到PageConfig模型?

修改

大多数问题是由于用户错误造成的。这发生在你身上..

检查数据库中的键约束是否已正确设置。
模型上的ICollection需要是虚拟的。

2 个答案:

答案 0 :(得分:6)

如果您想在这两个实体之间创建一对多关系,您的模型将是这样的:

public class PageConfig
{
    public int Id {get;set;}

    //navigation property
    public ICollection<Image> ScrollerImages {get;set;}
}

public class Image 
{
    public int Id {get;set;}

    //FK
    public int? PageConfigId {get;set;}

    //navigation property
    public PageConfig PageConfig {get;set;}
}

Fluent Api配置将是:

modelBuilder.Entity<Image>()
            .HasOptional(i=>i.PageConfig)
            .WithMany(pc=>pc.ScrollerImages)
            .HasForeignKey(i=> i.PageConfigId);

如果你想创建一个单向的一对多关系,那么删除Image实体上的FK和导航属性,并以这种方式配置关系:

modelBuilder.Entity<PageConfig>()
            .HasMany(pc => pc.ScrollerImages)
            .WithOptional();

检查此link以获取有关此类关系的更多信息

答案 1 :(得分:1)

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx

“...您可以使用Fluent API使用Student实体类配置一对多关系,如下所示。”

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
            //one-to-many 
            modelBuilder.Entity<Student>()
                        .HasRequired<Standard>(s => s.Standard)
                        .WithMany(s => s.Students)
                        .HasForeignKey(s => s.StdId);

    }

“...使用HasOptional方法代替HasRequired方法使外键列可以为空。”

所以你要寻找这样的东西:

modelBuilder.Entity<Image>()
            .HasOptional<PageConfig>(x => x.PageConfig)
            .WithMany(x => x.ScrollerImages)
            .HasForeignKey(x => x.PageConfigId)