2017-07-26 77 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"); 
});