Mvc Code First db context linq包含令人头疼的问题

时间:2013-04-11 18:47:27

标签: join asp.net-mvc-4 datatable ef-code-first

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

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")更难看的东西来克服这个问题?

1 个答案:

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