访问模型对象

时间:2011-03-23 16:14:28

标签: asp.net entity-framework asp.net-mvc-3 eager-loading

我有以下模型

旅行模型//想到Grails域类

public long FerryId { set;get; }
public long FromLocationId { set;get; }
public long ToLocationId { set;get; }

public Ferry Ferry { set;get; }
public Location FromLocation { set;get; }
public Location ToLocation { set;get; }

然后我将一个列表返回到视图并循环浏览:

@foreach (var item in Model) {
    @item.FerryId //displays fine
    @item.Ferry.FerryName //displays fine
    @item.FromLocationId //displays fine
    @item.FromLocation.LocationName //doesn't work
    @item.ToLocationId //displays fine
    @item.ToLocation.LocationName //doesn't work
}

问题是尝试获取“item.ToLocation.LocationName”和“item.FromLocation.LocationName”相同

我很担心为什么Ferry.FerryName会返回而不是其他人。

我对C#/ MVC3 / Razor来说是全新的,但是在grails / groovy中这不会有任何问题, 有什么想法吗?和额外的一般建议? 非常感谢。

3 个答案:

答案 0 :(得分:1)

你的意思是“不起作用”?我们可以诊断出错误消息吗?

没有它,我可以做出有根据的猜测...我猜你正在使用Entity Framework从数据库中检索这些模型对象,而FromLocation和ToLocation是对另一个实体的引用。如果这是正确的,您需要明确告诉EF在将模型传递给视图之前从数据库加载这些属性。这很简单......只需在您的LINQ查询中添加.Include("FromLocation").Include("ToLocation")即可从EF上下文中检索内容

有关此“热切加载”技术的更多信息以及加​​载相关实体的其他选项,请参阅http://msdn.microsoft.com/en-us/library/bb896272.aspx

答案 1 :(得分:0)

我认为是对的,这让我想问一下,FromLocation / ToLocation.LocationName的访问者是什么?是公开的吗?

对不起,如果这是一个愚蠢的问题,但有时候那些东西会让我感到...

HTH,

\ ^ /我l

答案 2 :(得分:0)

我查看了文档,查询不是问题:

var trips = DB.Trips.Include("FromLocation").Include("ToLocation").ToList();

但是我必须手动添加locaiton对象以保存:

[HttpPost]
public ActionResult Create(Trip trip)
{
    var fromLocation = DB.Locations.Find(trip.FromLocationId);
    var toLocation = DB.Locations.Find(trip.ToLocationId);
    trip.FromLocation = fromLocation;
    trip.ToLocation = toLocation;
    if (ModelState.IsValid)
    {
        DB.Trips.Add(trip);
        DB.SaveChanges();
        return RedirectToAction("Index");
    }
    else
    {
        return View(trip);
    }
}

现在我可以加载嵌套对象:

@item.ToLocation.LocationName
@item.FromLocation.LocationName

让我感到困惑的是Ferry对象的情况我没有手动添加它!