我正在尝试使用导航属性在我的控制器操作中添加相关字段,然后再将数据返回到我的视图。
我认为这会像下面的图片一样简单,因为我没有收到任何构建或语法错误。
我的型号:
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace LKGest.Models;
public partial class Quartier
{
[DisplayName("Numéro du quartier")]
public int NoQuartier { get; set; }
[Required(ErrorMessage = "Ce champ ne peut être vide!")]
[MaxLength(100, ErrorMessage = "Le nombre de caractères doit être inférieur à 100!")]
[DisplayName("Nom du quartier")]
public string NomQuartier { get; set; } = null!;
[DisplayName("Nom de la commune")]
public int NoCommune { get; set; }
[DisplayName("Remarques")]
public string? RemQuartier { get; set; }
public DateTime DteCreationDonnee { get; set; }
public DateTime DteChgtDonnee { get; set; }
public string MatAuteurChgtDonnee { get; set; } = null!;
[DisplayName("In/Actif")]
public bool Inactif { get; set; }
public virtual ICollection<MaisonsLocaux> MaisonsLocauxes { get; set; } = new List<MaisonsLocaux>();
[ValidateNever]
public virtual CommunesAbj NoCommuneNavigation { get; set; } = null!;
public virtual ICollection<RessourcesHumaine> RessourcesHumaines { get; set; } = new List<RessourcesHumaine>();
}
我的控制器:
public IActionResult list_Quartiers()
{
List<Quartier> liste_des_Quartiers = _db.Quartiers.Include(c => c.NoCommuneNavigation.NomCommune).ToList();
return View(liste_des_Quartiers);
}
这是我得到的错误:
系统.InvalidOperationException: '表达式'c.NoCommuneNavigation.NomCommune'在'Include'操作中无效,因为它不代表属性访问:'t => t.MyProperty'。要定位在派生类型上声明的导航,请使用强制转换 ('t => ((Derived)t).MyProperty') 或 'as' 运算符 ('t => (t as Derived).MyProperty')。可以通过组合Where、OrderBy(降序)、ThenBy(降序)、Skip 或 Take 操作来过滤集合导航访问。有关包含相关数据的详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkID=746393。'
啊,如果 NomCommune 是名称列,它会自动可用,只需
_db.Quartiers.AsNoTracking().Include(c => c.NoCommuneNavigation).ToList();
如果您想将 Quartiers 投影到包含 NomCommune 的视图模型,那么您不需要任何预先加载 .Include()
只需引用 NomCommune通过 Select()
: 中的导航参考
var quartiers = _db.Quartiers
.AsNotracking()
.Select(q => new QuartierViewModel
{
NoQuartier = q.NoQuartier,
NomQuartier = q.NomQuartier,
// ...
NomCommune = q.NoCommuneNavigation.NomCommune
}).ToList();
使用
Include
用于检索实体,例如当您想要编辑 Quartier 及其关联的 NoCommune 时,它告诉 EF“将此实体与其他相关实体一起加载”。这将为您提供一个 Quartier 以及整个 NoCommuneNavigation,您可以在其中访问公社 ID 以及名称等。
当您使用
Select()
进行项目时,您只需根据需要引用导航属性,EF 将根据您从相应表访问的属性自动编写 SQL SELECT
语句。投影的好处是您可以减少发送的列数,同时保护有关数据模式的信息不被窥探。只需避免将视图模型与实体混合(即选择相关实体到视图模型类中)