Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-多对多关系_C#_Many To Many_Entity Framework 4.1_Entity Relationship - Fatal编程技术网

C# 实体框架-多对多关系

C# 实体框架-多对多关系,c#,many-to-many,entity-framework-4.1,entity-relationship,C#,Many To Many,Entity Framework 4.1,Entity Relationship,嗨,我尝试使用EF Fluent API的多对多关系。我有两个POCO课程 public class Project { public int ProjectId { get; set; } public virtual ICollection<Author> Authors { get; set; } public Project() { Authors = new List<Author>(); } } p

嗨,我尝试使用EF Fluent API的多对多关系。我有两个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>();
    }
}
公共类项目
{
公共int ProjectId{get;set;}
公共虚拟ICollection作者{get;set;}
公共工程()
{
作者=新列表();
}
}
公共类作者
{
公共int AuthorId{get;set;}
公共虚拟ICollection项目{get;set;}
公共作者()
{
项目=新列表();
}
}
我将多对多关系映射到这部分代码:

        ////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");
                     });
///多对多
modelBuilder.Entity()
.HasMany(a=>a.Authors)
.有许多(p=>p.Projects)
.Map(m=>
{
m、 ToTable(“项目作者”);
m、 MapLeftKey(“ProjectId”);
m、 MapRightKey(“AuthorId”);
});
这将在DB中创建表项目。这是我第一次尝试这种关系映射


如果我省略了这个映射,它将创建具有类似模式的表AuthorProject。这是正确的,贝瓦希尔?

通过反复试验,我发现了以下几点。给定两个类

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; }
}
公共类AClass
{
公共int Id{get;set;}
公共ICollection B类{get;set;}
}
公共类B类
{
公共int Id{get;set;}
公共ICollection AClasses{get;set;}
}
…没有流畅的映射和这样的DbContext

public class MyContext : DbContext
{
    public DbSet<AClass> AClasses { get; set; }
    public DbSet<BClass> BClasses { get; set; }
}
公共类MyContext:DbContext
{
公共DbSet AClasses{get;set;}
公共数据库集b类{get;set;}
}
…创建的联接表的名称为BClassAClasses。如果我改变集合的顺序

public class MyContext : DbContext
{
    public DbSet<BClass> BClasses { get; set; }
    public DbSet<AClass> AClasses { get; set; }
}
公共类MyContext:DbContext
{
公共数据库集b类{get;set;}
公共DbSet AClasses{get;set;}
}
…创建的联接表的名称更改为aclassbclass,表中键列的顺序也更改。因此,联接表的名称和键列的顺序似乎取决于实体类“加载”到模型中的顺序——可以是
DbSet
声明的顺序,也可以是涉及更多关系的其他顺序——例如引用
AClass
的其他实体

最后,这一点都不重要,因为这样的多对多关系是“对称的”。如果您想拥有自己的联接表名称,可以像以前一样在Fluent API中指定它


因此,对于您的问题:是的,命名联接表
AuthorProjects
是正确的行为。如果名字是
ProjectAuthors
,那么这也是正确的行为。

@Ladislav:Nothing。我问这是否是我创建多对多关系时常见的EF行为。你是斯洛伐克人还是捷克人?是的,我是捷克人。据我所知,你的问题是正确的。@Ladislav:我在你的博客上读了几篇关于EF的文章,好工作:)