添加具有复杂类型属性的实体

时间:2018-07-22 08:48:40

标签: entity-framework-core asp.net-core-webapi

我正在尝试将学生实体添加到数据库中,如下所示:

public class Student
{
    public int ID { get; set; }

    public string Name { get; set; }

    public Course Course { get; set; }
}

Course类如下:

public class Course
{
    public int ID { get; set; }

    public string Name { get; set; }
}

“课程”表中的数据:

|   ID    |   Course   |
------------------------
|   1     |   Math     |
-----------------------
|   2     |   Physics  |
-----------------------

当我按如下所示定义学生时:

var student = new Student
{
   Name = "ABC",
   Course = new Course { ID = 1, Name = "Math"}
};

并尝试添加它

context.Students.add(student);
await context.SaveChangesAsync()

未添加实体。我添加了这一行代码

context.Entry(student).State = EntityState.Added;

但没有任何改变。

1 个答案:

答案 0 :(得分:1)

首先,您必须将外键 CourseId 设置为您的学生实体。

A)学生实体

public class Student
{
    public int StudentID { get; set; }

    public string Name { get; set; }

    public int CourseID { get; set; }  //This is foreign key

    public virtual Course Course { get; set; }
}

B)课程实体:ICollection属性为您提供具有特定课程ID的所有学生。

public class Course
{
    public int CourseID { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

1)如果您在新课程中添加了新的学生记录,则

Course course = new Course
{
    Name = "Math"
};

Course insertedCourse = context.Courses.Add(course);

Student student = new Student
{
    CourseID = insertedCourse.CourseID,
    Name = "ABC"
};

context.Students.Add(student);

await context.SaveChangesAsync();

2)如果必须从数据库中引用现有课程,则必须从数据库中获取课程并将CourseId分配给学生实体。

Course existingCourse = GetCourseByIdFromDatabase();

Student student = new Student
{
     CourseID = existingCourse.CourseID, //This ID comes from Db 
     Name = "ABC"
};

context.Students.Add(student);

await context.SaveChangesAsync();

尝试一次,可能对您有帮助。

已编辑:

据我对您的最后评论的理解,

如果您想让学生学习相应的课程,那么

您的获取学生方法如下

public Student GetStudent(int Id)
{
    Student student = context.Students.Find(Id);
    return new Student
    {
        StudentID = student.StudentID,
        Name = student.Name,
        Course = student.Course
    };
}

您可以通过以下方式访问学生的课程的广告

Student student = GetStudent(1);

string CourseName =   student.Course.Name;

您可以根据需要将asyncawait与以上代码一起使用。