【问题标题】:Updating Related Data with the Entity Framework 4 in MVC 3 - ContosoUniversity使用 MVC 3 中的实体框架 4 更新相关数据 - ContosoUniversity
【发布时间】:2011-07-21 22:41:14
【问题描述】:

在 ContosoUniversity 示例中来自 http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application 如何在学生/详细信息页面中显示每个学生的所有教师。我认为我需要通过以下实体才能获取讲师的数据:

学生(注册)

注册(课程)

课程(讲师)

讲师(课程)

我尝试使用“讲师”选项卡中的示例,但是当我必须为所有讲师准备实体时,我遇到了困难。

我创建了一个视图模型:

使用系统;

使用 System.Collections.Generic;

使用 ContosoUniversity.Models;

命名空间 ContosoUniversity.ViewModels

{

public class StudentIndexData

{

    public IEnumerable<Student> Students { get; set; }

    public IEnumerable<Enrollment> Enrollments { get; set; }

    public IEnumerable<Course> Courses { get; set; } 

    public IEnumerable<Instructor> Instructors { get; set; }

}

}

然后我从 StudentController 中的以下新的 MoreDetails 页面开始

public ActionResult MoreDetails(System.Int32?iStID)

    {
        var viewModel = new StudentIndexData();
        viewModel.Students = ctxDB.ctxStudents
        .Include(i => i.Enrollments.Select(c => c.Course))
        .Where(i => i.StudentID == iStID);



        if (iStID != null)
        {
            ViewBag.StudentID = iStID;

            viewModel.Enrollments = viewModel.Students.Where(i => i.StudentID == iStID).Single().Enrollments;
        }

        HERE IS WHERE I GET STUCK I DO NOT KNOW HOW TO POPULATE THE INSTRUCTORS ENTITY. AND COURSES ALSO.

        return View(viewModel);
    }

提前感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4


    【解决方案1】:

    试试这个代码:

    var std = db.Students
                .Include(s => s.Enrollments.Select(en=>en.Course))
                .Where(s => s.StudentId == id)
                .SingleOrDefault(); // or ToList() if you want fetch all students
    
    if(std != null){
    
        // do your work, for example, accessing this properties:
        var a = std; // the student
        var b = std.Enrollments; // student's enrollments
        var c = std.Enrollments.First().Course; // test for access one of the enrollments's course
        var d = c.Instructors; // test for access course's instructors all
    
        // or project all instructors in a List:
        var instructors = new List<Instructor>();
        foreach (var enr in std.Enrollments) {
            foreach (var ins in enr.Course.Instructors) {
                if (!instructors.Contains(ins)) {
                    instructors.Add(ins);
                }
             }
         } // now, the "instructors" contains all instructors associated with current user!
    
    }else{
        // if is null, do something else
    }
    

    问候

    更新

    如果您想测试查询,请将第一行替换为这一行:

    var stdquery = db.Students
                     .Include(s => s.Enrollments.Select(en=>en.Course))
                     .Where(s => s.PersonID == id);
    var std = stdquery.SingleOrDefault();
    

    你会在 stdquery 上看到这条 sql 语句:

    {SELECT 
    [Project1].[PersonID] AS [PersonID], 
    [Project1].[C1] AS [C1], 
    [Project1].[LastName] AS [LastName], 
    [Project1].[FirstName] AS [FirstName], 
    [Project1].[EnrollmentDate] AS [EnrollmentDate], 
    [Project1].[C2] AS [C2], 
    [Project1].[EnrollmentID] AS [EnrollmentID], 
    [Project1].[CourseID] AS [CourseID], 
    [Project1].[PersonID1] AS [PersonID1], 
    [Project1].[Grade] AS [Grade], 
    [Project1].[CourseID1] AS [CourseID1], 
    [Project1].[Title] AS [Title], 
    [Project1].[Credits] AS [Credits], 
    [Project1].[DepartmentID] AS [DepartmentID]
    FROM ( SELECT 
        [Extent1].[PersonID] AS [PersonID], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[EnrollmentDate] AS [EnrollmentDate], 
        '0X0X' AS [C1], 
        [Join1].[EnrollmentID] AS [EnrollmentID], 
        [Join1].[CourseID1] AS [CourseID], 
        [Join1].[PersonID] AS [PersonID1], 
        [Join1].[Grade] AS [Grade], 
        [Join1].[CourseID2] AS [CourseID1], 
        [Join1].[Title] AS [Title], 
        [Join1].[Credits] AS [Credits], 
        [Join1].[DepartmentID] AS [DepartmentID], 
        CASE WHEN ([Join1].[EnrollmentID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
        FROM  [dbo].[People] AS [Extent1]
        LEFT OUTER JOIN  (SELECT [Extent2].[EnrollmentID] AS [EnrollmentID], [Extent2].[CourseID] AS [CourseID1], [Extent2].[PersonID] AS [PersonID], [Extent2].[Grade] AS [Grade], [Extent3].[CourseID] AS [CourseID2], [Extent3].[Title] AS [Title], [Extent3].[Credits] AS [Credits], [Extent3].[DepartmentID] AS [DepartmentID]
            FROM  [dbo].[Enrollments] AS [Extent2]
            INNER JOIN [dbo].[Courses] AS [Extent3] ON [Extent2].[CourseID] = [Extent3].[CourseID] ) AS [Join1] ON [Extent1].[PersonID] = [Join1].[PersonID]
        WHERE ([Extent1].[Discriminator] = 'Student') AND ([Extent1].[PersonID] = @p__linq__0)
    )  AS [Project1]
    ORDER BY [Project1].[PersonID] ASC, [Project1].[C2] ASC}
    

    【讨论】:

    • Javad,非常感谢 - 它成功了。唯一的事情是我需要所有的讲师以及与课程的关系(作为实体?)所以在视图中我可以有一个包含学生课程和相应讲师的表格。见下文,我认为这将有助于在 foreach 循环中生成视图。先感谢您。课程 |部门 |讲师 1050 - 化学 |工程 |Fakhouri,Fadi 和 Abercrombie,Kim 4022 - 微观经济学 |经济学 |Harui,Roger 4041 - 宏观经济学 |经济学 |Harui,Roger
    • 一个学生或没有学生协会?嗯,我的英语不好):所以你想在没有任何过滤器的情况下为一个学生或数据库中的所有课程获取课程(及其依赖项)?
    • 另外,如果答案有用或对您有帮助,请投票:) 谢谢亲爱的保罗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2011-11-09
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多