Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 实体框架代码与链接表的一对多关系映射_Entity Framework_Ef Code First_Entity Relationship - Fatal编程技术网

Entity framework 实体框架代码与链接表的一对多关系映射

Entity framework 实体框架代码与链接表的一对多关系映射,entity-framework,ef-code-first,entity-relationship,Entity Framework,Ef Code First,Entity Relationship,有没有一种方法可以在两个表之间映射一对多关系,这两个表之间有链接(联接)表?为什么要为一对多关系映射联接表?您所需要的只是从一个到另一个的外键。联接表仅对多对多关系是必需的。从概念上讲,一对多关系只是多对多关系的一种特殊情况。使用代码(第一)方法,我们可以做完全相同的事情,定义多对多关系的简化版本。 使用中使用的相同示例,并假设从学生到课程的一对多关系,我们将: public class Student { public Student() { } public int Stu

有没有一种方法可以在两个表之间映射一对多关系,这两个表之间有链接(联接)表?

为什么要为一对多关系映射联接表?您所需要的只是从一个到另一个的外键。联接表仅对多对多关系是必需的。

从概念上讲,一对多关系只是多对多关系的一种特殊情况。使用代码(第一)方法,我们可以做完全相同的事情,定义多对多关系的简化版本。 使用中使用的相同示例,并假设从
学生
课程
的一对多关系,我们将:

public class Student
{
    public Student() { }

    public int StudentId { get; set; }
    public string StudentName { get; set; }

    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    public Course() { }

    public int CourseId { get; set; }
    public string CourseName { get; set; }

// We don't need this side of the relationship
//  public virtual ICollection<Student> Students { get; set; }
}

...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(/* c => c.Students */)  // 'WithMany' goes empty
                .Map(c => {
                     c.MapLeftKey("Student_id");
                     c.MapRightKey("Course_id");
                     c.ToTable("StudentAndCourse");
                 });

    base.OnModelCreating(modelBuilder);
}
公共班级学生
{
公立学生(){}
公共int StudentId{get;set;}
公共字符串StudentName{get;set;}
公共虚拟ICollection课程{get;set;}
}
公共课
{
公共课程(){}
public int CourseId{get;set;}
公共字符串CourseName{get;set;}
//我们不需要这种关系
//公共虚拟ICollection学生{get;set;}
}
...
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(s=>s.Courses)
.WithMany(/*c=>c.Students*/)/“WithMany”变为空
.Map(c=>{
c、 MapLeftKey(“学生id”);
c、 MapRightKey(“课程id”);
c、 ToTable(“学生和课程”);
});
基于模型创建(modelBuilder);
}

我发现你的老问题更好,至少它提供了更多的上下文:正确,但没有回答。我不敢相信这种情况如此罕见。对你的老问题做一点小的改变,把问题推到主动问题之上。我认为这是一个更好的方式,而不是创造完全相同的问题,但更没有上下文。或者更好:在你的旧问题中提供额外的信息和澄清,这可能会提高你获得答案的机会。我实际上认为,可能在那个问题中我给出了很多细节,而那个简单的问题可能会促使更多的回答。也许,太多细节有时是不好的。(我不认为你的老问题有太多。)但这次你的细节实在太少:)。顺便说一句,我又看了一遍你的老问题。你说得很对,但我确实有链接表。如果你已经有了一个现有的数据库模型,为什么要先使用代码?“代码优先”适用于以下情况:您希望根据对象模型从头开始创建数据库,并将根据支持对象模型的最佳方式创建数据库。您试图做的并不是支持对象模型的最佳方法。那么您建议采用哪种方法?我确实先从数据库开始,但发现代码优先允许更大的灵活性。这是一个新的项目,有新的数据库,虽然数据库和代码是同时开发的,但也有一些不同之处(其中之一是,如果存在一对多或多对多关系,则会创建链接表)。@Minnie:代码优先、数据库优先、模型优先对您的问题无关紧要。在数据库中,无论是在代码(注释、Fluent API)中还是在EDMX文件中,都不能定义一对多的映射,而在这两者之间有一个联接表。如果您让EF从数据库创建模型,您可能会得到多对多映射。我在想,无论一对多关系问题如何,Joel会建议哪种方法,因为这不是我首先开始编写代码的原因,但这可能需要问另一个问题。谢谢你们两位抽出时间。