2017-07-26 289 views
0

我正在构建一个.Net Core Web应用程序,以将旧的Access ADP/ADE前端替换为项目管理SQL Server数据库。但是,原始数据库的构建者并未设置大量的外键关系,而是倾向于在S​​QL视图中完成所有操作。我希望通过这个应用程序来解决这个问题。在.Net Core/EF Core中设置多个相同类的外键

我想确保我的头部环绕设置外键,当他们是相同的类类型。例如,我有以下课程。

Project.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; } 

随着我的DbContext类Employee类

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

和模型构建相应的声明

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类如何处理多个与项目类的关系。我需要像public ICollection<Project> PmProjects { get; set; }那样分开处理吗?

回答

0

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

在员工,你会:

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

在项目,你会:

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"); 
});