1

在我的应用程序中,结构如下所示:

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>
}

但是问题是在括号关闭后呈现 View/PartialView,using因此它尝试访问 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")

4

1 回答 1

1

您可以使用lambda 版本Include它只提供类型安全,但不能解决您的问题。

或者您可以完全关闭延迟加载,这将解决您的“包含问题”,但会禁用延迟加载功能的一些有效用例。

或者最好的解决方案是不在视图中使用实体,而是创建视图模型using并在块 内填充所需的数据。

所以你的视图模型看起来像这样:

public class AddressViewModel
{
   public string AddressAName { get; set; }
   public string AddressBName { get; set; }
}

然后在您的控制器中,您可以创建视图模型:

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>
}
于 2013-04-14T12:21:01.057 回答