0

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

最初,模型是这样传递给视图的......

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.

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

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

4

2 回答 2

1

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

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

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

然后,这意味着模型的全部内容都将回传到服务器。

于 2013-10-16T16:28:47.957 回答
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) {
    ...
}
于 2013-10-16T16:37:28.297 回答