asp.net-mvc - 延迟加载类未加载 - MVC

标签 asp.net-mvc entity-framework lazy-loading

我有客户:

public class Client
{
    public int ClientID { get; set; }
    public string ClientName { get; set; }
    public virtual List<Project> Projects { get; set; }
}

和项目:

public class Project
{
    public int ProjectID { get; set; }
    public string ProjectName { get; set; }
}

客户端 Controller 有一个获取细节的 Action :

public ActionResult Details(int id)
{
    Client client = db.Clients.Find(id);
    return View(client);
}

以及详细的帖子操作:

[HttpPost]
public ActionResult Details(Client client)
{
    if (ModelState.IsValid)
    {
        db.Entry(client).State = EntityState.Modified;
        db.SaveChanges();
                    // reload object from db to populate projects property
        client = db.Clients.Find(client.ClientID);
    }
    return View(client);
}

我的客户详情 View :

@model Client
<h1>@Html.DisplayFor(model => model.ClientName)</h1>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Client</legend>

        @Html.HiddenFor(model => model.ClientID)

        <div class="editor-label">
            @Html.LabelFor(model => model.ClientName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ClientName)
            @Html.ValidationMessageFor(model => model.ClientName)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<h2>Projects</h2>

<ul>
@foreach (Project project in Model.Projects)
{
    <li>@Html.ActionLink(project.ProjectName, "Details", "Project", new { id = project.ProjectID }, null)</li>
}
</ul>

现在如果我去找一个有项目的客户,它工作正常,我在文本框中看到客户名称和项目列表。我编辑名称并单击保存。但随后在子类列表迭代中出现 View 错误,“对象引用未设置为对象的实例。”

我在这一行中专门添加了从数据库重新加载实例,假设它随后会重新填充延迟加载列表类,并且我将拥有与 get 请求中相同的实例数据,只是名称发生了变化:

client = db.Clients.Find(client.ClientID);

为什么不在回传中加载子类?

修复此问题后,在客户端类中添加一个实例化 List 类的构造函数是否是个好主意,以防我导航到数据库中没有任何记录的客户端?

最佳答案

原因是 MVC 正在构建实际 POCO 的实例,不是派生自 POCO 的代理类的实例。因此,没有覆盖虚拟属性来执行延迟加载。

解决方案是通过条目显式加载集合(以替换您的 Clients.Find(id) 调用):

db.Entry(client).Collection( c => c.Projects ).Load();

关于asp.net-mvc - 延迟加载类未加载 - MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15566413/

相关文章:

c# - 如何使 Razor View 引擎使用 C# 6.0

c# - 悲观地锁定进程之间的代码

c# - Entity Framework Core - 使用外键值插入数据

c# - 基于深度 JSON 数据更新 EF 实体

java - Spring Data JPA、Hibernate、@ManyToOne(fetch=FetchType.LAZY) 和 org.hibernate.LazyInitializationException : could not initialize proxy - no Session

c# - 将 Razor 代码放入 JavaScript var 中

c# - MVC3 - 在同一 View 上多次使用模板

.net - 如何在 ASP.NET MVC 中将 View 模型转换为 JSON 对象?

c# - 虚拟属性不会在 Entity Framework 6 中延迟加载(警告)

jquery - 延迟加载图片元素