首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现员工与部门之间的外键关系表。我得到的DepartmentName值为零。我正在使用.NET-6 Razor页面

实现员工与部门之间的外键关系表。我得到的DepartmentName值为零。我正在使用.NET-6 Razor页面
EN

Stack Overflow用户
提问于 2022-09-25 09:27:51
回答 1查看 53关注 0票数 1

我用外键关系创建了这样的表。

代码语言:javascript
复制
create table Departments
(
    Id int primary key identity,
    Name varchar(100)
)
代码语言:javascript
复制
create table Employees
(
    Id int primary key identity,
    Name nvarchar(max),
    Salary decimal,
    DepartmentId int foreign key references Departments(Id)
)

模型

我建立了员工和部门的关系模型

代码语言:javascript
复制
public class Employees
{
        public int Id { get; set; }     
        public string Name { get; set; }
        public decimal Salary { get; set; }
        public int DepartmentId { get; set; }   

        public virtual Departments Department { get; set; }
}
代码语言:javascript
复制
public class Departments
{
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual List<Employees> Employees { get; set; }    
}

ViewModel

这是显示员工和部门数据的视图模型。在这里,我还想向DepartmentName展示

代码语言:javascript
复制
public class EmployeesVM
{
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Salary { get; set; }
        public int DepartmentId { get; set; }

        public string DepartmentName { get;set; }
}

Auto类

代码语言:javascript
复制
namespace EmployeeDetails.Helpers
{
    public class AutoMapperHelper:Profile
    {
        public AutoMapperHelper()
        {
            CreateMap<Employees, EmployeesVM>()
                .ForMember(dest => dest.DepartmentName, opt => { opt.MapFrom(src => src.Department.Name); });
        }
    }
}

Index.cshtml.cs

代码语言:javascript
复制
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace EmployeeDetails.Pages
{
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;
        private readonly ApplicationContext _context;
        private readonly IMapper _mapper;
        public IndexModel(ILogger<IndexModel> logger,ApplicationContext context,IMapper mapper)
        {
            _logger = logger;
            _context = context;
            _mapper = mapper;
        }
        [BindProperty]
        public List<EmployeesVM> EmployeesVM { get; set; }
        public void OnGet()
        {
           var result = _context.Employees.ToList();
            EmployeesVM = _mapper.Map<List<EmployeesVM>>(result);
        }
    }
}

您可以在图像'DepartmentName‘中看到null:

EN

回答 1

Stack Overflow用户

发布于 2022-09-25 12:55:38

通过模型中的导航属性,有3种不同的加载相关实体方法。在您的情况下,似乎没有启用懒惰加载 (就我个人而言,我不太喜欢它),所以您需要使用显式加载或使用急装

代码语言:javascript
复制
var result = _context.Employees
    .Include(e => e.Department)
    .ToList();
EmployeesVM = _mapper.Map<List<EmployeesVM>>(result);

UPD

另外,您可能希望使用AutoMapper的has 可查询扩展来防止通过ProjectTo<>方法过度获取句柄关系,该方法将告诉AutoMapper的映射引擎向IQueryable发出select子句,该子句将通知实体框架它只需要查询某些字段。

请注意,ProjectTo在支持映射(请参阅文档的这一部分)方面有很多限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73843406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档