我正在使用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关系,我如何访问视图中的数据而不是传递的模型?
答案 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) {
...
}