首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF-code-first多对多相关对象生成两个不同的SQL表(MVC3)

EF-code-first多对多相关对象生成两个不同的SQL表(MVC3)
EN

Stack Overflow用户
提问于 2012-05-24 21:44:39
回答 3查看 614关注 0票数 1

我读过this great Q&A,我试着做一些类似的东西。我的模型类包括:

代码语言:javascript
复制
public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ICollection<Course> CoursesAttending { get; set; }

    public Person()
    {
        this.CoursesAttending = new List<Course>();
    }
}

public class Course
{
    public int CourseId { get; set; }
    public string Title { get; set; }

    public ICollection<Person> Students { get; set; }
}

public class PersonCourse
{
    [Key, Column(Order = 0)]
    public int PersonID { get; set; }
    [Key, Column(Order = 1)]
    public int CourseID { get; set; }

    public virtual Person Student { get; set; }
    public virtual Course StudentCourse { get; set; }

    public int Mark { get; set; }
    public string Comment { get; set; }
}

public class SchoolContext : DbContext
{
    public DbSet<Course> Courses { get; set; }
    public DbSet<Person> People { get; set; }
    public DbSet<PersonCourse> PersonCourseLinks { get; set; }

    public SchoolContext()
        : base("ManyToManyTest")
    {
    }
}

现在,我尝试添加一个新人,并将新课程添加到他的课程列表中:

代码语言:javascript
复制
[HttpPost]
    public ActionResult Create(Person person)
    {
        if (ModelState.IsValid)
        {
            Course studentCourse;
            try
            {
                studentCourse = db.Courses.ToList<Course>().First();
            }
            catch
            {
                studentCourse = new Course() { Title = "HTML" };
            }

            person.CoursesAttending.Add(studentCourse);
            db.People.Add(person);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(person);
    }

一切正常,但是当我打开我创建的数据库时,我看到Person和Course类有两个链接表-PersonCourses(带有字段: PersonID,CourseID,Mark,Comment)和PersonCourse1 (带有字段: PersonID,CourseID),并且只有PersonCourse1有行(实际上是一行)。为什么会发生这种情况?我做错什么了吗?我希望只看到一个链接表-- PersonCourses表...

EN

回答 3

Stack Overflow用户

发布于 2012-05-24 21:52:30

我希望只看到一个链接表- PersonCourses表

然后,您必须通过CoursesAttending导航属性将PersonCourse实体与Person实体链接起来。对Course实体也要做同样的事情。

代码语言:javascript
复制
public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ICollection<PersonCourse> CoursesAttending { get; set; }

    public Person()
    {
        this.CoursesAttending = new List<PersonCourse>();
    }
}

public class Course
{
    public int CourseId { get; set; }
    public string Title { get; set; }

    public ICollection<PersonCourse> Students { get; set; }
}
票数 1
EN

Stack Overflow用户

发布于 2012-05-24 21:57:47

为gerund表中的外键属性提供外键关联:

代码语言:javascript
复制
public class PersonCourse
{
    [Key, Column(Order = 0)]
    public int PersonID { get; set; }
    [Key, Column(Order = 1)]
    public int CourseID { get; set; }

    [ForeignKey("PersonID")]
    public virtual Person Student { get; set; }

    [ForeignKey("CourseID")]
    public virtual Course StudentCourse { get; set; }

    public int Mark { get; set; }
    public string Comment { get; set; }
}
票数 0
EN

Stack Overflow用户

发布于 2013-10-08 18:47:00

现在你可以知道为什么你的代码没有像预期的那样工作:

代码语言:javascript
复制
public class PersonCourse
{
    [Key, Column(Order = 0)]
    public int PersonID { get; set; }
    [Key, Column(Order = 1)]
    public int CourseID { get; set; }

    public virtual Person Person { get; set; } // Follow built in conventions
    public virtual Course Course { get; set; }

    public int Mark { get; set; }
    public string Comment { get; set; }
}

这现在遵循了内置的实体框架约定

代码语言:javascript
复制
public int [ClassName][Id] or [Id] //Database Foreign Key column

and

public NavigationProperty [ClassName] // Navigation Property
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10738711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档