簡體   English   中英

實體框架 - 多對多的關系

[英]entity framework - many to many relationship

您好,我嘗試與EF Fluent API使用多對多關系。 我有2個POCO課程。

public class Project
{
    public int ProjectId { get; set; }

    public virtual ICollection<Author> Authors { get; set; }

    public Project()
    {
        Authors = new List<Author>();
    }
}

public class Author
{
    public int AuthorId { get; set; }

    public virtual ICollection<Project> Projects { get; set; }

    public Author()
    {
        Projects = new List<Project>();
    }
}

我用這部分代碼映射了很多很多關系:

        ////MANY TO MANY 
        modelBuilder.Entity<Project>()
            .HasMany<Author>(a => a.Authors)
            .WithMany(p => p.Projects)
            .Map(m =>
                     {
                         m.ToTable("ProjectAuthors");
                         m.MapLeftKey("ProjectId");
                         m.MapRightKey("AuthorId");
                     });

這在DB中創建了ProjectsAuthors表。 這是我對這種關系映射案例的第一次嘗試。

如果我省略了這個映射,它創建了具有類似模式的表AuthorProject。 這是正確的bevahior?

經過反復試驗,我發現了以下內容。 鑒於兩個班級......

public class AClass
{
    public int Id { get; set; }
    public ICollection<BClass> BClasses { get; set; }
}

public class BClass
{
    public int Id { get; set; }
    public ICollection<AClass> AClasses { get; set; }
}

...沒有像這樣的Fluent映射和DbContext ......

public class MyContext : DbContext
{
    public DbSet<AClass> AClasses { get; set; }
    public DbSet<BClass> BClasses { get; set; }
}

...創建的連接表的名稱是BClassAClasses 如果我改變集合的順序......

public class MyContext : DbContext
{
    public DbSet<BClass> BClasses { get; set; }
    public DbSet<AClass> AClasses { get; set; }
}

...創建的連接表的名稱更改為AClassBClasses ,表中的鍵列順序也會更改。 因此,連接表的名稱和鍵列的順序似乎取決於實體類“加載”到模型中的順序 - 如果有更多關系,則可以是DbSet聲明的順序或其他順序涉及 - 例如一些其他實體AClass

最后,它根本不重要,因為這種多對多關系是“對稱的”。 如果您想擁有自己的連接表名稱,可以像以前一樣在Fluent API中指定它。

那么,對於您的問題:是的,命名連接表AuthorProjects是正確的行為。 如果名稱是ProjectAuthors那么它也是正確的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM