2013-10-16 24 views
0

我正在使用asp.net mvc和Entity Framwork。我仍然熟悉这个堆栈。我想包含与传递给视图的模型没有外键关系的数据。在视图模型中包含无关数据

最初,该模型被传递给这样的观点...

public ActionResult Edit(int id = 0) 
{ 
booking booking = db.bookings.Find(id); 
return View(booking); 
} 

我需要在视图中没有与预订一FK关系的数据。

我试图创建一个单独的类把两个实体的...

public ActionResult Edit(int id = 0) 
{ 
booking booking = db.bookings.Find(id); 
viewModel.bookingtraces = (from l in db.traces where l.bookingid == booking.bookingid  select l); 
viewModel.bookings = booking; 
return View(viewModel); 
} 

目前,我得到一个错误,这个虽然。一开始页面将加载,但尝试更新的时候,我得到

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries. 

我也尝试添加一个条目构建器明确定义的关系,但没有奏效。

最终,问题是,如果两个实体之间没有FK关系,我如何在视图中访问不是要传递的模型的一部分的数据?

+0

你可以通过viewbag也 – Miller

+0

感谢米勒。我需要能够调用保存预订跟踪,ViewBag不允许据我所知。 – tintyethan

+0

您是否尝试过在查询后添加.ToArray()? IMO应该在控制器中填充视图模型,而不是等待视图执行以便查询运行 – MikeSW

回答

1

我会建议您不要简单地使用实体类作为您的模型,而是研究创建包含您需要的属性的复合模型(我通常在基本视图模型中实现常见功能,并从中继承)。通过这种方式,您可以完全控制模型对象的实例化以及它们包含的属性。 通过这种方式,当您回发邮件时,整个模型会回发到服务器。复合模型的

一个优点,将包括一个单一的模型内的许多实体或POCO对象的能力,例如:被回发

public class MyModel { 
    public booking Booking {get;set;} 
    public SomeOtherEntityObject EObject{get;set;} 
    public SomePocoObject {get;set;} 
} 

这些将随后意味着模型的全部内容到服务器。

1

您可以可以使用您的实体模型,并通过额外的数据视图通过ViewBag

public ActionResult Edit(int id = 0) { 
    Booking booking = db.bookings.Find(id); 
    ViewBag.bookingtraces = 
     from l in db.traces 
     where l.bookingid == booking.bookingid 
     select l; 
    return View(booking); 
} 

OR

您可以定义视图模型

public class MyViewModel { 
    public Booking booking { get; set; } 
    public IEnumerable<BookingTrace> traces { get; set; } 
} 

,然后在您的行动方法中,您可以只绑定预订属性

[HttpPost] 
public ActionResult Edit(Booking booking) { 
    ... 
} 
相关问题