我的第一个MVC3 EF 4.2站点和我在一些事情上感到困惑,目前在查询和保存时在ViewModels上。如果我解释得不好,请纠正我,我不知道该怎么说。edmx自动创建了表类,但我读到创建ViewModel更好,因为我需要连接表才能完全显示/编辑我的产品。下面的控制器代码是我连接表以输出要编辑的产品,然后保存的地方。我的问题是,将产品保存到DbContext生成的Product.cs模型或我自己的ProductViewModel.cs模型的正确方法是什么?
有没有一种更简单的方法可以查询产品并连接表,然后映射到视图模型参数,或者我可以像下面这样在控制器中继续执行所有这些操作?
我还想在每次有人查看/点击产品时保存/更新产品,所以我不确定是创建一个单独的ViewModel来更新该参数,还是再次使用产品模型。
希望这是有道理的!如果需要,我可以进一步解释。
private SiteForgeEntities db = new SiteForgeEntities();
public ActionResult Edit(int id)
{
var viewModel = (
from a in db.Products
join b in db.Sites
on a.SiteId equals b.SiteId
join c in db.Sections
on a.SectionId equals c.SectionId
join d in db.Affiliates
on a.AffiliateId equals d.AffiliateId
select new ProductViewModel()
{
ProductId = a.ProductId,
Product = a.Product,
Description = a.Description,
Image = a.Image,
Price = a.Price,
Clicks = a.Clicks,
Link = a.Link,
Site = b.Site,
Section = c.Section,
Affiliate = d.Affiliate
}).Single(x => x.ProductId == id);
return View(viewModel);
}
[HttpPost]
public ActionResult Edit(Product product)
{
...update database...do I pass in and save back to Product or my ProductViewModel
}
使用ViewModel将多个模型传递到视图,但在保存数据时,需要将其保存到适当的模型。如果您正在添加或修改产品,您将向产品添加项目(使用DbContext)。如果您在两个模型之间定义了一对多关系(在Product.cs模型中,您可能有一个声明为:的属性
public virtual ICollection<SomeOtherModel> SomeOtherData { get; set; }
您可以使用它来构建一个表,而不是在ViewModel中传递所有内容。这里有一个很好的教程,介绍使用EF4的CRUD操作。看看这些简短的教程,它们可以让你了解你的策略http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc.