gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:46:17 26 4
gpt4 key购买 nike

我有客户:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com