在视图模型中包含不相关的数据

时间:2013-10-16 16:11:20

标签: c# asp.net-mvc entity-framework

我正在使用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);
}

目前,我收到了这个错误。 GET页面将加载,但在尝试更新时,我得到了

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.

我还尝试添加一个modelBuilder条目来明确定义关系,但这不起作用。

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

2 个答案:

答案 0 :(得分:1)

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

复合模型的一个优点是能够在单个模型中包含许多实体或POCO对象,例如:

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

这些意味着模型的全部内容都会发回服务器。

答案 1 :(得分: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);
}

您可以定义视图模型

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

然后在您的操作方法中,您只能绑定预订属性

[HttpPost]
public ActionResult Edit(Booking booking) {
    ...
}