如何使用实体框架在 .NET 上的一对多关系中的多列上添加导航

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

我有 2 个表,其中多列指向一个实体或表。

[Table("opcr")]
public class Opcr
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string? Title { get; set; }
  
    [Required]
    public string DepartmentHeadId { get; set; }
    [ForeignKey(nameof(DepartmentHeadId))]
    public ApplicationUser DepartmentHead { get; set; }

    [Required]
    public string EvaluatedById { get; set; }
    [ForeignKey(nameof(EvaluatedById))]
    public ApplicationUser EvaluatedBy { get; set; }

    [Required]
    public string ReviewedById { get; set; }
    [ForeignKey(nameof(ReviewedById))]
    public ApplicationUser ReviewedBy { get; set; }
}
using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations;

namespace LGU_HR.Models;

public class ApplicationUser : IdentityUser
{
    [Required]
    [MaxLength(50)]
    public string? FirstName { get; set; }
    [Required]
    [MaxLength(50)]
    public string? LastName { get; set; }

    // if I uncomment this, I'll get an error
    // public ICollection<Opcr> DepartmentHead { get; } 
    // public ICollection<Opcr> EvaluatedBy { get; }
    // public ICollection<Opcr>? ReviewedBy { get; }
}

我想要此连接,以便我可以通过用户搜索

OPCR
表。这是一对多关系,但是当我取消注释
DepartmentHead
上的
ApplicationUser
时,出现以下错误:

无法创建类型为“”的“DbContext”。异常“无法确定类型为“ICollection”的导航“ApplicationUser.DepartmentHead”表示的关系。手动配置关系,或者使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。尝试创建实例时抛出。对于设计时支持的不同模式

我已阅读此文档,但他们没有这个示例。

有人可以解释一下这种情况吗?不知道我哪里错了。

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

我认为这是因为你没有遵守命名约定,在集合的情况下应该只是实际名称

Opcrs
- 在你的情况下这当然是不可能的,因为属性名称必须是唯一的。

此外,尝试思考 EF 现在如何将哪个集合对应于

Opcr
中的哪个外键?这很模糊。

您需要明确定义该关系,例如:

modelBuilder.Entity<ApplicationUser>()
    .HasMany(t => t.DepartmentHead)
    .WithOne(t => t.DepartmentHead)

与其他属性类似。

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