如何使用现有ID中的id显示其他表中的数据

时间:2016-07-22 23:57:25

标签: c# asp.net-mvc entity-framework

我正在使用.NET Core MVC,情况就是这样。

我有一个数据库,有很多关系。

我有一个"课程"表。我有一个"讲师"表

我还有一张桌子" CourseLecturers"使用复合键,由2个id组成。 LecturerId和CoursesID。

我正在使用Entity Framework和Model View Controller来显示我的数据。

Courses表的模型如下所示:

public partial class Courses
{
    [Key]
    public int CourseId { get; set; }
    public string CourseTitle { get; set; }
}

我的Lecturers表的模型看起来像similair:

public partial class Lecturers
{
   [Key]
    public int LecturerId { get; set; }
    public string Lecturer { get; set; }
}

我的CourseLecturers表的模型如下所示:

public partial class CourseLecturers
{
    public int CourseId { get; set; }
    public int LecturerId { get; set; }  
}

我有或者我想做的问题是:我想使用我的CourseLecturers控制器,以便它显示CourseTitle和Lecturer。不是CourseId和LecturerId。有什么方法可以访问这些属性吗?

这是我的Index控制器中的CourseLecturers方法:

 public IActionResult Index()
    {
        /*
        CourseLecturers courseLecturers = new CourseLecturers();
        List<String> lista=new List<String>();
        foreach (var item in _context.CourseLecturers)
        {
            lista.Add(_context.Courses.Where(c => c.CourseId == courseLecturers.CourseId).ToString());
        }
        */
        return View(_context.CourseLecturers.ToList());
    }

我正在疯狂地试验控制器,这将只返回默认的整数和id。 (因为我评论了代码)我不知道该向谁求助。因为我的CourseLecturers模型有两个整数,所以甚至可以出现两个字符串而不是整数吗?不允许这样的事情似乎很愚蠢。所以我能得到的任何帮助都将不胜感激。

尝试stuartd解决方案后

Soo,这是 CourseLecturers 表的默认上下文:

 modelBuilder.Entity<CourseLecturers>(entity =>
        {
            entity.HasKey(e => new { e.LecturerId, e.CourseId })
                .HasName("PK_courseLecturers");

            entity.ToTable("courseLecturers");

            entity.Property(e => e.LecturerId).HasColumnName("lecturerID");

            entity.Property(e => e.CourseId).HasColumnName("courseID");
        });

抛出构建错误。 我对该代码所做的更改如下:

modelBuilder.Entity<CourseLecturers>(entity =>
        {
            entity.HasKey(e => new { e.Lecturers.LecturerId, e.Courses.CourseId })
                .HasName("PK_courseLecturers");

            entity.ToTable("courseLecturers");

            entity.Property(e => e.Lecturers.LecturerId).HasColumnName("lecturerID");

            entity.Property(e => e.Courses.CourseId).HasColumnName("courseID");
        });

哪个是正确的,但会引发异常: 类型&#39; System.ArgumentException&#39;的例外情况发生在Microsoft.EntityFrameworkCore.dll中但未在用户代码中处理

附加信息:属性表达式&#39; e =&gt; new&lt;&gt; f__AnonymousType1`2(LecturerId = e.Lecturers.LecturerId,CourseId = e.Courses.CourseId)&#39;无效。表达式应代表属性访问权限:&#39; t =&gt; t.MyProperty&#39 ;.指定多个属性时,请使用匿名类型:&#39; t =&gt;新{t.MyProperty1,t.MyProperty2}&#39;。

所以,就是这样。

2 个答案:

答案 0 :(得分:0)

您的CourseLecturers课程应该包含对实际CourseLecturer的引用,而不是ID:

public partial class CourseLecturers
{
    public Course Course { get; set; }
    public Lecturer Lecturer { get; set; } 
}

答案 1 :(得分:0)

所以,对我有用的解决方案是:

在联结表中你需要添加&#34; [ForeignKey(nameof(nameOfTable))]&#34;对于主键的每个部分(因为我有一个复合PK)。

我的联结表看起来像这样:

public partial class CourseLecturers
{
    [Key]
    [ForeignKey(nameof(Courses))]
    public int CourseId { get; set; }
    public Courses Courses { get; set; }

    [Key]
    [ForeignKey(nameof(Lecturers))]
    public int LecturerId { get; set; }
    public Lecturers Lecturers { get; set; }
}

在我的联结表控制器中,使用index方法,您需要将列表返回到您的视图,如下所示:

public IActionResult Index()
    {
        return View(_context.CourseLecturers
       .Include(c => c.Courses).Include(c => c.Lecturers).ToList());
    }

Atleast这对我有用。

最后,在你看来,你有类似的东西:

 @foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Courses.CourseTitle)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Lecturers.Lecturer)
        </td>
    </tr>
}

这就是它最终对我有用的方式。