为.NET MVC中部署的ObjectContext设计回退的最佳方法是什么

时间:2015-03-05 02:29:47

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

我试图在我的视图中显示对象的属性(如果存在),否则会回退到默认值,例如。

@if(Product.Description != null && Product.Description.Color != null){
    <li>@Product.Description.Color</li>
}

这个问题是,如果我在视图中进行空检查,那么如果它没有存在且抛出异常,则会为Product.Description处理ObjectContext。

我应该在控制器中指定默认值/后退还是有办法在视图中处理此问题?

2 个答案:

答案 0 :(得分:7)

不要向视图发送“实时”对象。如果您这样做,则可以有效地混合UI和数据层。请记住,控制器在渲染视图时已完成执行。

而是发送一份副本,其中包含您需要在视图中使用的属性。

我知道有些书认为 M VC中的“M”代表“Domain M odel”,他们认为这应该是一个实例,实例,实体框架实体。我不同意,并认为这是责任。

我很幸运使用了“AutoMapper”工具,这使得从EF实体的属性和您在视图中使用的模型(ViewModel)的属性进行映射变得很简单。

答案 1 :(得分:4)

正如约翰在评论中提到的,以下内容通常不赞成:

public ActionResult Index()
{
  var db = new MyDbContext();

  var model = db.Products.FirstOrDefault();

  return View(model);
}

相反,在将值映射到视图模型时正确处理上下文:

public ActionResult Index()
{
  var model = new IndexVM();

  using (var db = new MyDbContext())
  {
    // Assuming EF
    var dbProduct = db.Products.FirstOrDefault();
    // Even better performance:
    var dbProduct = db.Products
      // prevent lazy loading
      .Include(p => p.Description.Color)
      .FirstOrDefault()
      // prevent ef tracking with proxy objects
      .AsNoTracking();

    // can be automated with AutoMapper or other .Net Components
    ProductVM productVM = new ProductVM();
    productVM.Id = dbProduct.Id;
    // etc

    // Don't put logic in View:
    productVM.HasDescription = (product.Description != null);
    if (productVM.HasDescription)
    {
       var descriptionVM = new DescriptionVM();
       // map values
       productVM.Description = descriptionVM;
    }

    model.Product = productVM;
  }

  return View(model);
}

现在视图并没有真正做到逻辑本身:

@if(product.HasDescription && product.Description.HasColor){
  <li>@Product.Description.Color</li>
}