在我的应用程序中,结构如下所示:
public class Route
{
[Key]
public int RouteId {get; set;}
public Address virtual AddressA {get; set;}
public Address virtual AddressB {get; set;}
}
public class Address
{
[Key]
public int AddressId {get; set;}
public string Name {get; set;}
}
和
public class DbConnection : DbContext
{
public DbSet<Route> Routes{get; set;}
public DbSet<Address> Addresses{get; set;}
}
我接受这样的数据:
public ActionResult GetList()
{
using(DbConnection db = new DbConnection)
{
var query = db.Routes.ToList();
}
return PartialView(query);
}
然后显示数据:
@foreach (var r in Model)
{
<div>@r.AddressA.Name - @r.AddressB.Name</div>
}
但是问题是在using
括号关闭后呈现View / PartialView,因此它尝试访问AddressA的名称,这会给我一个错误,因为表没有加载完整。是的,我能做到:
public ActionResult GetList()
{
using(DbConnection db = new DbConnection)
{
var query = db.Routes.Include("Address").ToList();
}
return PartialView(query);
}
但是,当我将这个问题变得更复杂时,代码开始变得非常丑陋。是否有一些方法可以通过一行简单的代码或比.Include("A").Include("B").Include("X.Y.Z")
更难看的东西来克服这个问题?
答案 0 :(得分:1)
您可以使用Include
using
public class AddressViewModel
{
public string AddressAName { get; set; }
public string AddressBName { get; set; }
}
只提供类型安全但不能解决您的问题。
或者你可以lambda version完全解决你的“包含问题”,但会禁用延迟加载功能的一些有效用例。
或者最佳解决方案是不在视图中使用您的实体,而是创建视图模型,并在public ActionResult GetList()
{
using(DbConnection db = new DbConnection)
{
var query = db.Routes.Select(r =>
new AddressViewModel
{
AddressAName = r.AddressA.Name,
AddressBName = r.AddressB.Name,
}).ToList();
}
return PartialView(query);
}
块内填充所需的数据。
所以你的视图模型看起来像这样:
@foreach (var r in Model)
{
<div>@r.AddressAName - @r.AddressBName</div>
}
然后在您的控制器中,您可以创建viewmodel:
{{1}}
您可以在视图中轻松使用
{{1}}