0

好的!

我不得不说这两种技术都很棒。虽然似乎有些东西我不明白。

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

我有一个带有 List 或 IEnumerable 或 IQueryable 或其他任何东西的模型......

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

using (var datatabse = new MyEntity)
{
}

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

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

所以代替 List<(EF4Type)> 或 IEnumerable<(EF4Type)> 或 IQueryable<(EF4Type)>

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

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

4

3 回答 3

3

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

请参阅加载相关对象(实体框架)

以下示例将导致在同一查询中使用部门检索所有课程。这是急切的加载

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

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

于 2012-05-17T20:49:14.183 回答
2

除了jrummell 记得的急切加载之外,还有另一种加载相关条目的方式,它是显式加载。假设您有一个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();
于 2012-05-17T21:01:29.577 回答
1

导师,

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

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

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

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
}
于 2012-05-17T20:40:57.833 回答