ASP.NET Core 8 MVC 和 EF Core 导航属性

问题描述 投票:0回答:1

我正在尝试使用导航属性在我的控制器操作中添加相关字段,然后再将数据返回到我的视图。

我认为这会像下面的图片一样简单,因为我没有收到任何构建或语法错误。

我的型号:

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。'

enter image description here

asp.net-core entity-framework-core asp.net-core-mvc
1个回答
0
投票

啊,如果 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
语句。投影的好处是您可以减少发送的列数,同时保护有关数据模式的信息不被窥探。只需避免将视图模型与实体混合(即选择相关实体到视图模型类中)

© www.soinside.com 2019 - 2024. All rights reserved.