【问题标题】:MVC 3 and Entity Framework 4.1 data loading issueMVC 3 和 Entity Framework 4.1 数据加载问题
【发布时间】:2012-05-17 20:35:42
【问题描述】:

好的!

我不得不说这两种技术都很棒。虽然好像有什么我不明白。

您的数据库中有一个数据(假设您想显示一个表中的数据,该表引用了其他表)。

我有一个带有 List 或 IEnumerable 或 IQueryable 或其他的模型......

所以在我看来,我想通过对象列表进行 foreach 并利用对其他表的引用的酷特性。当您在控制器中时,控制器没有问题

using (var datatabse = new MyEntity)
{
}

但是当您停止使用 db has 已释放时,您会遇到常见错误 ObjectContext 实例已被释放,不能再用于需要连接的操作。

所以我没有看到其他选项作为在内存中创建实体对象的副本...但是您丢失了所有很酷的 EF4 引用,您必须首先在模型中手动加载数据,然后使用 foreach 在视图中显示它。

所以而不是 List 或 IEnumerable 或 IQueryable

您必须执行 List 其中 MyCustomHelperClass 表示具有与实体对象类似的属性的类,并且可能还有一些额外的因为您无权访问引用表的属性然后您必须执行 foreach 并将数据加载到此List 和另一个 @foreach 在视图上使用 Razor 显示所有内容。

两倍的工作量,如果项目很大......您可以更全面地了解您需要多少这些 helperClass。所有这些很酷的新技术真的要以这种方式使用吗?....还是我错过了什么。

【问题讨论】:

  • 当您在视图中引用延迟加载的属性时,您可能会遇到该错误。在将它传递给视图之前,您应该在控制器中预先加载您需要的所有内容。
  • 急切负载是您在 linq 链上使用 Include(othertable) 的地方

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


【解决方案1】:

当您在视图中引用延迟加载的属性时,您可能会遇到该错误。在将它传递给视图之前,您应该在控制器中预先加载您需要的所有内容。

Loading Related Objects (Entity Framework)

以下示例将导致在同一查询中检索所有课程以及部门。这是渴望加载

// Load all departments and related courses
var departments1 = context.Departments                           
    .Include(d => d.Courses)                           
    .ToList();

如果没有 Include() 部分,以后可以检索课程(可能在您的上下文已在视图中处理之后)。这称为延迟加载

【讨论】:

  • hmmm...这是 EF5 Beta 功能吗?
  • 不,这种特殊语法在 EF 4+ 中可用。你可以在以前的版本中这样做,但我认为语法不同。
【解决方案2】:

除了 jrummell 记得的 eager loading 之外,还有另一种加载相关条目的方法,它是 explicit loading。假设您有一个User 实体,其中有许多Groups 实体与之相关。您可以显式加载它们:

var user = context.Users.Find(id); // Load the user.

context.Entry(user)
    .Collection(u => u.Groups)
    .Load();

这样你就不必使用.Include(),甚至可以过滤Groups

context.Entry(user)
    .Collection(u => u.Groups)
    .Query()
    .Where(g => g.SomeProperty.Contains("something"))
    .Load();

【讨论】:

    【解决方案3】:

    导师,

    根据您是否拥有存储库或数据库上下文,此对象应该只在控制器操作(请求)期间存在,因此您应该能够在操作范围内执行所需的所有操作。

    也许我误解了,但根据你的问题,这就是你的问题。如果我误解了,那么我仍然建议应该跨控制器引用数据库存储库或数据库上下文,而不是每次都在操作中调用它。

    所以你应该在你的控制器中看到这样的东西:

    public class TasksController : BaseController
    {
        private readonly TaskService _serviceTasks;
        public TasksController(IRepository repository)
        {
            _serviceTasks = new TaskService(repository);
        }
    
        //
        // GET: /Tasks/
    
        public ActionResult Index()
        {
            var viewModel = _serviceTasks.All<Task>();
            return View(viewModel);         
        }
    
        public ActionResult Details(int id)
        {
            var domainModel = _serviceTasks.GetById<Task>(id);
            var viewModel = PopulateDetailsViewModel(domainModel);
            return View(viewModel);
        }
    
        //.. rest of actions cut
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2011-08-01
      相关资源
      最近更新 更多