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

问题描述:

有两种方法可以映射两个表之间具有链接(连接)表的一对多关系吗?实体框架代码与链接表的第一个一对多关系映射

+0

我发现你的老问题更好,至少它提供了更多的字段:http ://*.com/q/7064796/270591 – Slauma

+0

正确,但没有回应。我无法相信这种情况非常罕见。 – Minnie

+2

在您的旧问题上做一些小改动,将问题推到活动问题之上。我认为这是一种更好的方式,而不是再次创建完全相同的问题,但使用更少的上下文。或者更好:在你的旧问题中提供额外的信息和澄清,这可能会提高你获得答案的机会。 – Slauma

为什么你会有一个一对多关系的连接表?所有你需要的是从一个到另一个的外键。只有多对多关系才需要连接表。

+0

你说得很对,但我确实有这个链接表。 – Minnie

+0

那么,如果你已经有了一个现有的数据库模型,为什么你要使用代码优先?代码优先是针对您希望根据您的对象模型**从头开始创建数据库的情况**,并将根据支持您的对象模型的最佳方式创建数据库。你所要做的不是支持你的对象模型的最佳方式。 –

+0

那么你会建议哪种方法?我确实从数据库开始,但首先发现代码允许更多的灵活性。这是新的项目,并有新的数据库,尽管数据库和代码同时开发,但有一些差异(其中之一是,如果有一对多或多对多的关系,链接表被创建)。 – Minnie

从概念上讲,一对多关系只是多对多的特殊情况。使用代码(第一种)方法,我们可以完全相同,定义多对多关系的简化版本。使用 在Entity Framework Tutorial使用的同样的例子,假设一个一对多的关系,从StudentCourse,我们将有:

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); 
}