【问题标题】:display datas from one-to-many relation .net显示来自一对多关系.net的数据
【发布时间】:2021-07-29 10:52:37
【问题描述】:

首先,我是 c# 和 .net 的真正初学者,我是 10 天前开始的,所以 我试图显示一对多关系中的数据,但我有一个错误System.NullReferenceException:'对象引用未设置为对象的实例。(我检查了数据库中有数据表),我不明白为什么。我阅读了很多关于此的帖子,但它从来没有用过,我的代码与 microsoft doc 页面上的示例几乎相同,但我的不起作用。

型号

        [Display(Name = "Formations")]
        public virtual ICollection<Courses> Course { get; set; }

    }

    public class Courses
    {
        [Key]
        public int CourseId { get; set; }
        [Display(Name = "Formations")]
        public string Course { get; set; }

        public virtual Users users { get; set; }
    }

控制器


       public async Task<IActionResult> Details(int? id)
       {
           if (id == null)
           {
               return NotFound();
           }

           var users = await _context.Users
               .FirstOrDefaultAsync(m => m.Id == id);
           if (users == null)
           {
               return NotFound();
           }

           return View(users);

查看

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

【问题讨论】:

  • 首先您需要找到 nullreference 异常的来源。然后你可以检查如何防止这种情况。看这里:stackoverflow.com/a/4660186/7968203
  • 错误来自我在视图中的循环,如果它是你的意思。
  • 这可能是因为课程属性没有加载。搜索用户时包括课程。 var users = await _context.Users.Include(x =&gt; x.Course) .FirstOrDefaultAsync(m =&gt; m.Id == id);

标签: c# asp.net-mvc


【解决方案1】:

我假设您的模型是User 类型。 查询实体 (User) 时,不会自动从数据库中读取相关实体 (Courses),因此您的集合是/曾经是 null

您可以通过在 Linq 查询中使用 Include() 来更改它:await _context.Users.Include(u =&gt; u.Courses).FirstOrDefaultAsync(m =&gt; m.Id == id);

只是一些额外的小建议来改进您的代码,这有助于您了解正在发生的事情:

  • 将您的 Courses 班级重命名为 Course,因为您的班级仅代表一门课程。
  • Course 属性重命名为Courses,因为它是Course 类型的许多对象的集合
  • 使用空列表/哈希集初始化您的课程集合,如 public virtual public virtual ICollection&lt;Courses&gt; Course { get; set; } = new HashSet&lt;Course&gt;(); 以避免空引用异常
  • 在您看来,将item 重命名为course。 “Foreach (single) course in (many) courses” 更易于阅读和理解

【讨论】:

  • 当我在寻找如何解决我的问题时,我试图用一个空列表初始化我的集合,我没有错误了,但我的循环没有显示任何东西,所以我认为这不是正确的事情做。无论如何,我用你的代码做到了,一切正常,非常感谢你的帮助。这个小项目是为了一份工作,所以如果我得到它,我会欠你一个;)
  • 集合的初始化只是为了避免空引用异常,就像在未正确加载关系时的原始情况一样。导致不显示任何项目的空列表比尝试访问非退出对象的属性时崩溃的程序要好。祝你工作申请好运!希望啤酒作为奖励:D
【解决方案2】:

修正动作

 var users = await _context.Users.Include(i=>i.Course)
               .FirstOrDefaultAsync(m => m.Id == id);
          

由于您使用的是 displayfor,因此您必须将 foreach 循环替换为 for 循环

@model User
....
@if (Model.Course!=null)
{
  @for (var i=0; i<= Model.Course.Count; i+=1)
                { 
                    <tr>
                        <td>
                            @Html.DisplayFor(model=> model.Course[i].Course)
                        </td>
                    </tr>
                }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2018-01-22
    相关资源
    最近更新 更多