【问题标题】:Entity Framework and Table Relationship Error Out实体框架和表关系错误输出
【发布时间】:2021-02-04 13:54:18
【问题描述】:

我是 Entity Framework 的新手,很难弄清楚我做错了什么。 在普通 SQL 数据库上使用 ASP.Net MVC、C# 和 EF6。

这是我的控制器代码。

using (var context = new MyEntities())
        {
            var result = context.Streamers.OrderBy(x => x.AddedDate);
            foreach (var item in result)
            {
                var linkResult = context.Links.Where(x => x.StreamerId == item.Id);
                item.Links = linkResult.ToList();
            }
            return View(result.ToList());
        }

这是我的观点

@{int i = 0;}
@foreach (var streamer in Model)
{
var className = i % 2 == 0 ? "col-lg-6 order-lg-2" : "col-lg-6";
var className2 = i % 2 == 0 ? "col-lg-6 order-lg-1" : "col-lg-6";
i++;
<section>
    <div class="container">
        <div class="row align-items-center">
            <div class="@className">
                <div class="p-5">
                    <a href="@streamer.StreamerUrl" target="_blank">
                        <img class="img-fluid rounded-circle" src="@streamer.StreamerImage" alt="@streamer.StreamerName">
                    </a>
                </div>
            </div>
            <div class="@className2">
                <div class="p-5">
                    <a href="@streamer.StreamerUrl" target="_blank">
                        <h2 class="display-4">@streamer.StreamerName</h2>
                    </a>
                    <p>@streamer.StreamerDescription</p>
                    <ul>
                        @foreach (var link in streamer.Links)
                        {
                            <li><a href="@link.LinkAddress" target="_blank">@link.LinkName</a></li>
                        }
                    </ul>
                </div>
            </div>
        </div>
    </div>
</section>
}

代码在 for each for streamer.Links 上出错

System.ObjectDisposedException: 'The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.'

谁能帮我弄清楚我在这里做错了什么?有没有更简单的方法可以做到这一点? 提前致谢

【问题讨论】:

  • LinkAddress 是一个简单的属性(字符串)还是一个导航(存储在另一个表中)?
  • 存储在另一个表中。

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


【解决方案1】:

您的 DbContext 可能已被丢弃。当 for 循环命中时,Link 不会附加到上下文,并且无法使用地址加载导航属性。查询链接时加载链接地址:

context.Links.Include(c => c.LinkAddress).Where(x => x.StreamerId == item.Id);

【讨论】:

    【解决方案2】:

    如果您不想更改 Html,请尝试以下操作:

    using (var context = new MyEntities())
      {
               result = context.Streamers.Include(c => c.Links)
               .OrderBy(c=> c.AddedDate).ToList();
       }
    

    【讨论】:

      【解决方案3】:

      尝试使用此代码:

      List<Streamer> result;
      using (var context = new MyEntities())
        {
                 result = context.Streamers.OrderBy(x => x.AddedDate).ToList();
               foreach (var item in result)
               {
        item.Links =  = context.Links.Where(x => x.StreamerId == item.Id).ToList();
               }
        }
        return View(result);
      

      但由于您没有过滤流媒体,您可以试试这个:

      using (var context = new MyEntities())
        {
                 result = context.Streamers.Include("Links").OrderBy(x => x.AddedDate).ToList();
             
        }
      

      【讨论】:

        猜你喜欢
        • 2014-03-25
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        相关资源
        最近更新 更多