0

我没有首先使用代码,我创建了一个名为艺术家的表,其中包含一个 ID 和名称字段,一个名为专辑的表,其中包含一个 ID 和标题字段,以及一个包含艺术家 ID 和专辑 ID 的 junction_artists_albums 表。

这是我的模型/上下文类:

艺术家:

    public class Artist
{
    public int Id { get; set; }
    public string ArtistName { get; set; }

    public ICollection<Album> albums { get; set; }
}

专辑:

    public class Album
{
    public int Id { get; set; }
    public string AlbumName { get; set; }

    public ICollection<Artist> artists { get; set; }


}

音乐数据库上下文:

    public class MusicDBContext : DbContext
{
    public MusicDBContext() { }

    public DbSet<Artist> Artists { get; set; }
    public DbSet<Album> Albums { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Album>().HasMany<Artist>(a => a.artists).WithMany(a => a.albums);
    }
}

这不起作用,因为连接表没有被填写。对不起,如果这是一个愚蠢的问题,但我对实体框架很陌生

4

1 回答 1

1

不,不是那么愚蠢。解决方案很简单。

在处理多对多关系时,您不需要显式指定联结表,除非存在关系字段。例如,由艺术家制作的专辑,您可能会有制作日期或其他内容。

你需要在这里做的就是稍微改变一下你以这种方式所做的事情

public class Artist
{
    public int Id { get; set; }
    public string ArtistName { get; set; }

    #region Navigation Properties
    public virtual ICollection<Album> Albums { get; set; }
    #endregion
}

public class Album
{
    public int Id { get; set; }
    public string AlbumName { get; set; }

    public virtual ICollection<Artist> Artists { get; set; }
}

我不知道这到底是什么意思,但您可以删除 OnModelCreating 事件覆盖

请注意,EF Code first 中的导航属性和外键规范始终是虚拟属性。

当存在多对多关系时,您只需要指定相关的导航属性,EF 将负责其余部分,并且将创建包含两个主键的联结表。如果像我之前告诉过的那样,存在一些关系字段,则需要手动创建 Junction 表,然后显式创建一个包含键和关系字段的类。

EF 中有一些叫做约定的东西,它只是一组您将习惯的命名约定和一些可以帮助您显式设置外键等的装饰器。

于 2014-01-16T12:01:35.730 回答