【问题标题】:Setting up multiple Foreign keys of same class in .Net Core / EF Core在.Net Core / EF Core中设置多个相同类的外键
【发布时间】:2023-03-31 03:12:01
【问题描述】:

我正在构建一个 .Net Core Web 应用程序,以将旧的 Access ADP/ADE 前端替换为项目管理 SQL Server 数据库。但是,原始数据库的构建者并没有设置很多外键关系,而是在 SQL 视图中完成所有这些。我希望用这个应用程序来补救。

我想确保当外键属于同一类类型时,我已经开始考虑设置外键了。例如,我有以下课程。

项目.cs

using System;
using System.Collections.Generic;

namespace ProjectLogic.Models
{
    public class Project
    {
        public int Id { get; set; };
        public string Name { get; set; }
        public int? PmEmployeeId { get; set; }
        public int? CadEmployeeId { get; set; }
        public int? SalesRepEmployeeId { get; set; }
        ...
    }
}

Employee.cs

using System;
using System.Collections.Generic;

namespace ProjectLogic.Models
{
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        ...
    }
}

我在项目类结束时的键会像这样吗?

public Employee PmEmployee { get; set; }
public Employee CadEmployee { get; set; }
public Employee SalesRepEmployee { get; set; }

在Employee类中有相应的声明

public ICollection<Project> Projects { get; set; }

还有我的 DbContext 类中的模型生成器

modelBuilder.Entity<Project>(entity =>
{
// Fluent API for column properties
...
entity.HasOne(d => d.PmEmployee)
    .WithMany(p => p.Projects)
    .HasForeignKey(d => d.PmEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_PM");

entity.HasOne(d => d.CadEmployee)
    .WithMany(p => p.Projects)
    .HasForeignKey(d => d.CadEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_CAD");

entity.HasOne(d => d.SalesRepEmployee)
    .WithMany(p => p.Projects)
    .HasForeignKey(d => d.SalesRepEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_SALES");
});

我想我最大的担忧/问题是 Employee 类将如何处理与 Project 类的多个关系。我需要像public ICollection&lt;Project&gt; PmProjects { get; set; }一样单独处理吗?

【问题讨论】:

    标签: c# entity-framework asp.net-core


    【解决方案1】:

    是的,您需要有单独的项目集合。

    在员工中,您将:

    public ICollection<Project> PmProjects { get; set; }
    public ICollection<Project> CadProjects { get; set; }
    public ICollection<Project> SalesProjects { get; set; }
    

    在 Project 中,您将拥有:

    public Employee PmEmployee { get; set; }
    public Employee CadEmployee { get; set; }
    public Employee SalesRepEmployee { get; set; }
    

    建造者是:

    modelBuilder.Entity<Project>(entity =>
    {
    // Fluent API for column properties
    ...
    entity.HasOne(d => d.PmEmployee)
        .WithMany(p => p.PmProjects)
        .HasForeignKey(d => d.PmEmployeeId)
        .OnDelete(DeleteBehavior.SetNull)
        .HasConstraintName("FK_Project_Employee_PM");
    
    entity.HasOne(d => d.CadEmployee)
        .WithMany(p => p.CadProjects)
        .HasForeignKey(d => d.CadEmployeeId)
        .OnDelete(DeleteBehavior.SetNull)
        .HasConstraintName("FK_Project_Employee_CAD");
    
     entity.HasOne(d => d.SalesRepEmployee)
        .WithMany(p => p.SalesProjects)
        .HasForeignKey(d => d.SalesRepEmployeeId)
        .OnDelete(DeleteBehavior.SetNull)
        .HasConstraintName("FK_Project_Employee_SALES");
     });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多