繁体   English   中英

插入到 EF Core ASP.NET Core Razor Pages .NET6 中自动生成的 Bridge 表

[英]Insert to autogenerated Bridge table in EF Core ASP.NET Core Razor Pages .NET6

我是 EF 新手,需要帮助理解以下内容:我在数据库中有一个 Class 表和一个学生表。 一个 Class 可以有多个学生,一个学生可以在多个班级。 我有一个由 EF 核心自动生成的表,名为 ClassModelStudent。 它有以下字段:

班级模型学生表

我创建了一个 razor 页面来创建 class 并且在发布事件时,按钮应该发送 ClassID 并重定向到 AddStudents 页面。 在此处输入图像描述

以下是 AddStudents Class 的代码:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using TestProject.Model;

namespace TestProject.Pages.Classes
{
    public class EnrollmentModel : PageModel
    {
        private readonly TestProject.Data.TestProjectContext _context;

    public EnrollmentModel(TestProject.Data.TestProjectContext context)
    {
        _context = context;
    }
    [BindProperty]
   public Enrollment Enrollments { get; set; }   
    public SelectList Classes { get; set; }    
    public IList<Student> UserProfile { get; set; }
    [BindProperty(SupportsGet = true)]
    public string? SearchString { get; set; }
    public async Task OnGetAsync()
    {
        var students = from s in _context.User_Profile
                       select s;
        if (!string.IsNullOrEmpty(SearchString))
        {
            students = students.Where(s => s.FirstName.Contains(SearchString));
        }

        UserProfile = await students.ToListAsync();

        var classes = from i in _context.Class
                          orderby i.Description
                          select i;

        Classes = new SelectList(classes, "ClassID", 
"Description");

    }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {

            return Page();
        }
       //THIS IS WHERE I TRIED ACCESSING CLASSMODELSTUDENT TABLE 
      //AND THE CONTEXT DID NOT SEE IT
       // _context.e
        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}

}

我目前已将其连接到 Enrollments 表。 我什至不确定是否应该将其写入自动生成的表 ClassModelStudents 或手动创建的 Enrollments? 注册表如下所示:

报名表

在 AddStudents 页面中,我在表格中显示学生列表。 我在表格的每一行中创建了“添加到类”按钮。 当单击“添加到班级”按钮时,我想将该学生添加到选定的 class 中。 我应该写给 ClassModelStudents 表。 请看下面的 AddStudents 页面截图: 添加学生

我不明白的是如何为 ClassModelStudent 创建 class(模型)? 因为我无法使用上下文直接访问此表。 如何访问该表以将 ClassID 和 StudentID 写入其中?

请指教..我非常感谢您的帮助..

当您在TestProjectContext中创建many-to-many关系时,您是否编写代码如下:

    .......

    public Dbset<Class> classes;
    public Dbset<students> students;

ClassModelStudent表是EF核心自动生成的,不能用_context.ClassModelStudent插入数据吗?

如果你的问题和我上面提到的一样,你可以用另一种方法来创建many-to-many关系,我写了一个简单的demo:

Model

 public class Group
    {
        public int Id { get; set; }
        public string GroupName { get; set; }
        public List<GroupMembers> GroupMembers { get; set; }
    }

public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public List<GroupMembers> GroupMembers { get; set; }
    }

public class GroupMembers
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public User user { get; set; }

        public int GroupId { get; set; }
        public Group group { get; set; }
    }

数据上下文

public class WebTestContext : DbContext
    {
        public WebTestContext(DbContextOptions<WebTestContext> options):base(options)
        {

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<GroupMembers>()
                .HasKey(gm => new { gm.UserId, gm.GroupId });
            modelBuilder.Entity<GroupMembers>()
                .HasOne(gm => gm.group)
                .WithMany(group=> group.GroupMembers)
                .HasForeignKey(gm => gm.GroupId);
            modelBuilder.Entity<GroupMembers>()
                .HasOne(gm => gm.user)
                .WithMany(user => user.GroupMembers)
                .HasForeignKey(gm => gm.UserId);
        }
        public DbSet<User> usertable { get; set; }
        public DbSet<Group> grouptable { get; set; }
        public DbSet<GroupMembers> GroupMembers { get; set; }
    }

这样在DataContext中创建多对多关系,可以在pagemodel中使用_context.(Relational tables)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM