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

13

我有以下模型

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需要是virtual类型。


1
那看起来像是Entity Framework,而不是MVC。 - Scott Chamberlain
你是对的,我犯了个错误。 - opdb
2个回答

10
如果您想在这两个实体之间创建一对多关系,则您的模型将如下所示:
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;}
}

流畅Api配置如下:

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

如果你的想法是创建一个单向一对多关系,则需要删除Image实体上的外键和导航属性,并按照以下方式配置关系:
modelBuilder.Entity<PageConfig>()
            .HasMany(pc => pc.ScrollerImages)
            .WithOptional();

请查看此链接以获取关于此类关系的更多信息。


我需要的是单向一对多关系。HasOptional似乎没有无参数构造函数,我不确定该怎么办。 - opdb
我原以为它可以是任意顺序,但我已经修改了那段代码,请现在检查。 - ocuenca
原来表面下还有更多问题,但现在一切都运行顺畅了。由于您的答案涵盖了常见情况,因此是正确的。谢谢。 - opdb

1
根据http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx,您可以使用Fluent API配置一个One-to-Many关系,如下所示,使用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)

图像不知道任何关于PageConfig的信息,所以我不确定如何使用你的例子。单个图像可以被许多PageConfig使用,并且图像不需要以任何方式了解PageConfig。 - opdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接