Итак, я новичок в программировании, и я пытаюсь сделать свой первый проект .net, и я застрял.
У меня есть база данных, содержащая таблицу Product, она выглядит так:
[Key]
public int ProductId { get; set; }
public string ProductName { get; set; }
[Range(1, int.MaxValue)]
public double ProductPrice { get; set; }
public string ProductDescription { get; set; }
public string ProductImagePath { get; set; }
public int ProductColorId { get; set; }
[ForeignKey("ProductColorId")]
public virtual ProductColor ProductColor { get; set; }
public int ProductShippingOptionId { get; set; }
[ForeignKey("ProductShippingOptionId")]
public virtual ProductShippingOption ProductShippingOption { get; set; }
public int ProductConditionId { get; set; }
[ForeignKey("ProductConditionId")]
public virtual ProductCondition ProductCondition { get; set; }
Столбцы ProductShippingOption, ProductColor и ProductCondition — это отдельные таблицы, каждая из которых содержит столбцы для идентификатора и имени.
Когда я добавляю продукт в базу данных, я хочу показать сведения только об одном продукте в представлении, но мне нужно отобразить ProductConditionName вместо ProductConditionId (например).
Что я должен включить в свою ViewModel и свой контроллер, чтобы я мог использовать его в своем представлении?
Мое действие в ProductController выглядит так
public IActionResult ProductTemplate(int? id)
{
ProductVM productVM = new ProductVM()
{
Product = _db.Product.Find(id),
};
if (id == 0)
{
return NotFound();
}
if (id == 0)
{
return NotFound();
}
if (productVM==null)
{
return NotFound();
}
return View(productVM);
}
Спасибо!
Лучший и самый простой способ сделать это — включить классы в Product:
Для вашего действия ProductTemplate:
ProductVM productVM = new ProductVM()
{
Product = _db.Product.Where(s=>s.Id == id)
.Include(s=>s.ProductColor)
.Include(s=>s.ProductShippingOption)
.Include(s=>s.ProductCondition)
.FirstOrDefault();
};
И вы можете вызвать их в своем .cshtml с помощью (допустим, вы хотите имя ProductColor):
@Model.Product.ProductColor.Name
В качестве альтернативы вы можете добавить Include()
к своему контексту, чтобы включить все по умолчанию.
Спасибо, я обычно использую «Где», поэтому не знал, что мы не можем включить после находки. Отредактировано соответственно
Нет проблем, это просто замазать. Это несколько отменяет совет в вашем последнем абзаце. Независимо от того, где вы поместите Include
(если он стоит перед перечислением), он работает точно так же. На самом деле нет способа «добавить его в ваш контекст», изменив порядок связанного метода (опять же, я игнорирую пост-перечисление, поскольку это просто не работает).
Почти уверен, что
Include
должен идти передFind
, так какFind
запускает перечисление в вашем запросе. Вы можете избежать добавления включений позже в тех случаях, когда перечисление еще не запущено (например, послеWhere
), но не после того, как перечисление уже произошло (Find
,Single
,First
, ...)